From 33ad810e580f763a9e29d50469c6399365d2f266 Mon Sep 17 00:00:00 2001 From: Stefan Bischof Date: Fri, 18 Sep 2026 17:30:05 +0200 Subject: [PATCH] feat(pivot-duckdb): access mode and DuckDB JDBC options via env, with ITs; re-resolve runbundles Signed-off-by: Stefan Bischof --- .../pivot/common/daanse.pivot.base.bndrun | 2 +- application/pivot/duckdb/README.md | 58 +++++++++++- .../pivot/duckdb/daanse.pivot.duckdb.bndrun | 2 +- .../pivot/duckdb/DuckdbEnvConfigurator.java | 31 ++++++- .../pivot/duckdb/DuckdbPivotIT.java | 90 +++++++++++++++++-- application/pivot/h2/daanse.pivot.h2.bndrun | 2 +- .../pivot/mariadb/daanse.pivot.mariadb.bndrun | 2 +- .../pivot/mssql/daanse.pivot.mssql.bndrun | 2 +- .../pivot/mysql/daanse.pivot.mysql.bndrun | 2 +- .../pivot/oracle/daanse.pivot.oracle.bndrun | 2 +- .../postgres/daanse.pivot.postgres.bndrun | 2 +- .../playground/daanse.playground.bndrun | 2 +- application/probe/daanse.probe.bndrun | 2 +- 13 files changed, 176 insertions(+), 23 deletions(-) diff --git a/application/pivot/common/daanse.pivot.base.bndrun b/application/pivot/common/daanse.pivot.base.bndrun index fb047ef..3dba61a 100644 --- a/application/pivot/common/daanse.pivot.base.bndrun +++ b/application/pivot/common/daanse.pivot.base.bndrun @@ -70,7 +70,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -100,6 +99,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/duckdb/README.md b/application/pivot/duckdb/README.md index 209eec4..edc7467 100644 --- a/application/pivot/duckdb/README.md +++ b/application/pivot/duckdb/README.md @@ -4,7 +4,7 @@ Production Daanse OLAP (XMLA) server image for **DuckDB**. The image ships the Daanse ROLAP engine, the XMLA endpoint, the DuckDB JDBC driver, the DataSource and the matching SQL dialect. It is configured entirely through environment variables. The DuckDB database is a file mounted into the container and is -opened read-only by default (an in-memory DuckDB would be private to each +opened read-only by default (DuckDB `access_mode=READ_ONLY`; an in-memory DuckDB would be private to each connection and is therefore not useful here). Note: this image is based on Debian (`eclipse-temurin:25-jre`) instead of @@ -32,9 +32,59 @@ location and the server starts. | Variable | Default | Description | |---|---|---| -| `DAANSE_JDBC_DATABASE_NAME` | `/app/data/database.duckdb` | Path of the DuckDB database file inside the container | -| `DAANSE_JDBC_READ_ONLY` | `true` | Open the database read-only (allows other processes to read the same file); the connection pool inherits this mode | -| `DAANSE_JDBC_SETTINGS` | *(unset)* | Comma separated DuckDB settings, each as `name=value` | +| `DAANSE_JDBC_DATABASE_NAME` | `/app/data/database.duckdb` | Path of the DuckDB database file inside the container; must not contain `;` | +| `DAANSE_JDBC_READ_ONLY` | `true` | Open the database read-only (allows other processes to read the same file); the connection pool inherits this mode. Shorthand for the DuckDB setting `access_mode=READ_ONLY` | +| `DAANSE_JDBC_ACCESS_MODE` | *(unset)* | DuckDB `access_mode`: `AUTOMATIC`, `READ_ONLY` or `READ_WRITE`; replaces the read-only default | +| `DAANSE_JDBC_STREAM_RESULTS` | `false` | Stream result sets instead of materializing them (`jdbc_stream_results`) | +| `DAANSE_JDBC_AUTO_COMMIT` | `true` | Default auto-commit mode of the connections (`jdbc_auto_commit`) | +| `DAANSE_JDBC_CUSTOM_USER_AGENT` | *(unset)* | String appended to the user agent reported to DuckDB (`custom_user_agent`) | +| `DAANSE_JDBC_INSTANCE_CACHE` | `true` | Reuse the process-wide database instance for the same file (`jdbc_instance_cache`) | +| `DAANSE_JDBC_PIN_DB` | `false` | Keep the database instance alive after its last connection closes (`jdbc_pin_db`); the server holds the database open anyway | +| `DAANSE_JDBC_IGNORE_UNSUPPORTED_OPTIONS` | `false` | Drop settings DuckDB does not know instead of refusing to start (`jdbc_ignore_unsupported_options`) | +| `DAANSE_JDBC_JFR_MEMORY_MONITOR` | *(unset)* | Name under which the database is tracked in the `duckdb.MemoryUsage` JFR event (`jdbc_jfr_memory_monitor`) | +| `DAANSE_JDBC_SESSION_INIT_SQL_FILE` | *(unset)* | SQL file inside the container that is run before connections are used, see below | +| `DAANSE_JDBC_SESSION_INIT_SQL_FILE_SHA256` | *(unset)* | Expected SHA-256 digest (hex) of that file; the server refuses to connect on a mismatch | +| `DAANSE_JDBC_SETTINGS` | *(unset)* | Comma separated DuckDB settings, each as `name=value`, e.g. `threads=4,memory_limit=4GB` | + +### Access mode + +The database is opened with DuckDB's `access_mode=READ_ONLY` unless told +otherwise. The mode can be set either way: + +| Configuration | Result | +|---|---| +| *(nothing)* | read-only | +| `DAANSE_JDBC_READ_ONLY=true` or `DAANSE_JDBC_ACCESS_MODE=READ_ONLY` | read-only | +| `DAANSE_JDBC_READ_ONLY=false` or `DAANSE_JDBC_ACCESS_MODE=READ_WRITE` | read-write (mount the file without `:ro`; DuckDB then locks it exclusively) | +| `DAANSE_JDBC_ACCESS_MODE=AUTOMATIC` | DuckDB decides (read-write for a file) | + +`DAANSE_JDBC_ACCESS_MODE` replaces the read-only default, and the connection +pool follows the resulting mode. An `access_mode=...` entry in +`DAANSE_JDBC_SETTINGS` works the same way; `DAANSE_JDBC_ACCESS_MODE` wins over it. Do not set +`DAANSE_JDBC_READ_ONLY=true` together with a different `access_mode` — DuckDB +refuses to open the database. + +### Session init SQL file + +`DAANSE_JDBC_SESSION_INIT_SQL_FILE` names a SQL file (at most 1 MB, path without +`;` and `=`) mounted into the container. The part above the marker comment runs +once when the database is opened, the part below it for every connection: + +```sql +CREATE OR REPLACE VIEW "Fact" AS SELECT * FROM "FactData"; + +/* DUCKDB_CONNECTION_INIT_BELOW_MARKER */ + +SET search_path = 'analytics'; +``` + +The file runs with the full privileges of the connection — statements that +write need a read-write access mode. Pin its content with +`DAANSE_JDBC_SESSION_INIT_SQL_FILE_SHA256`. + +`DAANSE_JDBC_SETTINGS` configures the database, not a single connection; +settings of session scope (`search_path`, `schema`, profiling) belong below the +marker of the session init SQL file instead. ## Source diff --git a/application/pivot/duckdb/daanse.pivot.duckdb.bndrun b/application/pivot/duckdb/daanse.pivot.duckdb.bndrun index 5a1fd1a..d549d70 100644 --- a/application/pivot/duckdb/daanse.pivot.duckdb.bndrun +++ b/application/pivot/duckdb/daanse.pivot.duckdb.bndrun @@ -27,7 +27,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -60,6 +59,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/duckdb/src/main/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbEnvConfigurator.java b/application/pivot/duckdb/src/main/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbEnvConfigurator.java index 2388448..1cdc1ee 100644 --- a/application/pivot/duckdb/src/main/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbEnvConfigurator.java +++ b/application/pivot/duckdb/src/main/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbEnvConfigurator.java @@ -38,7 +38,9 @@ * variables and creates the BasicContext against it. Every attribute of * {@link DsConfig} is supported. The database file defaults to * {@code /app/data/database.duckdb} (mount it into the container) and is - * opened read-only unless {@code DAANSE_JDBC_READ_ONLY=false}. + * opened read-only unless {@code DAANSE_JDBC_READ_ONLY=false} or + * {@code DAANSE_JDBC_ACCESS_MODE} (or an {@code access_mode} entry of + * {@code DAANSE_JDBC_SETTINGS}) names another mode. */ @Component(immediate = true) @RequireConfigurationAdmin @@ -63,8 +65,12 @@ public void activate() throws IOException { if (props.get(Constants.DATASOURCE_PROPERTY_DATABASENAME) == null) { props.put(Constants.DATASOURCE_PROPERTY_DATABASENAME, DEFAULT_DATABASE_FILE); } + // A given access mode decides; read-only is only the default where it + // is absent. DuckDB refuses the two contradicting. + String accessMode = accessMode(props); + boolean accessModeReadOnly = Constants.ACCESS_MODE_READ_ONLY.equalsIgnoreCase(accessMode); if (props.get(Constants.DATASOURCE_PROPERTY_READ_ONLY) == null) { - props.put(Constants.DATASOURCE_PROPERTY_READ_ONLY, true); + props.put(Constants.DATASOURCE_PROPERTY_READ_ONLY, accessMode == null || accessModeReadOnly); } props.put(ServerConstants.PROP_IDENT, ServerConstants.IDENT_DATASOURCE); @@ -74,11 +80,30 @@ public void activate() throws IOException { // DuckDB connections are fixed to the read-only mode of the DataSource; // the pool must mark its connections the same way or the driver refuses. confPoolAndContext = BasicContextConfigs.createEnvPoolAndContext(ca, DIALECT_NAME, - (Boolean) props.get(Constants.DATASOURCE_PROPERTY_READ_ONLY)); + accessModeReadOnly || (Boolean) props.get(Constants.DATASOURCE_PROPERTY_READ_ONLY)); logger.info("DuckDB DataSource, connection pool and context configured from environment"); } + /** + * The configured access mode - the attribute, else the {@code access_mode} + * entry of the settings - or {@code null}. + */ + static String accessMode(Dictionary props) { + if (props.get(Constants.DATASOURCE_PROPERTY_ACCESS_MODE) instanceof String attribute) { + return attribute.trim(); + } + if (props.get(Constants.DATASOURCE_PROPERTY_SETTINGS) instanceof String[] entries) { + for (String entry : entries) { + int equals = entry.indexOf('='); + if (equals > 0 && Constants.SETTING_ACCESS_MODE.equalsIgnoreCase(entry.substring(0, equals).trim())) { + return entry.substring(equals + 1).trim(); + } + } + } + return null; + } + @Deactivate public void deactivate() throws IOException { if (confDataSource != null) { diff --git a/application/pivot/duckdb/src/test/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbPivotIT.java b/application/pivot/duckdb/src/test/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbPivotIT.java index fd2636f..ea115f0 100644 --- a/application/pivot/duckdb/src/test/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbPivotIT.java +++ b/application/pivot/duckdb/src/test/java/org/eclipse/daanse/server/application/pivot/duckdb/DuckdbPivotIT.java @@ -20,8 +20,11 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; +import java.util.Map; +import java.util.concurrent.Future; import org.eclipse.daanse.server.application.pivot.common.test.PivotContainers; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.testcontainers.containers.GenericContainer; @@ -33,30 +36,105 @@ * End-to-end test: creates a DuckDB database file with the Fact table of the * static test catalog, builds the daanse-pivot-duckdb image from its real * Dockerfile, mounts database file and catalog and verifies via XMLA that the - * MDX sum over the VALUE column is queryable. + * MDX sum over the VALUE column is queryable - in the read-only and read-write + * access modes the image can be configured to. */ @Testcontainers(disabledWithoutDocker = true) class DuckdbPivotIT { + /** Not writable for the container user: only a read-only open succeeds. */ + private static final int MODE_NOT_WRITABLE = 0444; + private static final int MODE_WRITABLE = 0666; + @TempDir static Path tempDir; - @Test - void sumMeasureIsQueryableViaXmla() throws Exception { - Path databaseFile = tempDir.resolve("database.duckdb"); + private static Path databaseFile; + private static Future image; + + @BeforeAll + static void createDatabase() throws Exception { + databaseFile = tempDir.resolve("database.duckdb"); try (Connection connection = DriverManager.getConnection("jdbc:duckdb:" + databaseFile); Statement statement = connection.createStatement()) { statement.executeUpdate("CREATE TABLE \"Fact\" (\"KEY\" VARCHAR, \"VALUE\" INTEGER)"); statement.executeUpdate("INSERT INTO \"Fact\" VALUES ('A', 1), ('B', 2), ('C', 3)"); } assertTrue(Files.exists(databaseFile)); + image = PivotContainers.pivotImage("duckdb"); + } + + @Test + void sumMeasureIsQueryableViaXmla() throws Exception { + assertSumIsQueryable(Map.of(), MODE_WRITABLE); + } + + @Test + void opensReadOnlyByDefault() throws Exception { + assertSumIsQueryable(Map.of(), MODE_NOT_WRITABLE); + } + + @Test + void accessModeReadOnlyOpensReadOnly() throws Exception { + assertSumIsQueryable(Map.of("DAANSE_JDBC_ACCESS_MODE", "READ_ONLY"), MODE_NOT_WRITABLE); + } + + /** The access mode decides, and the connection pool has to follow it. */ + @Test + void accessModeReadOnlyWinsOverReadOnlyFalse() throws Exception { + assertSumIsQueryable(Map.of("DAANSE_JDBC_ACCESS_MODE", "READ_ONLY", "DAANSE_JDBC_READ_ONLY", "false"), + MODE_NOT_WRITABLE); + } + + @Test + void accessModeSettingOpensReadOnly() throws Exception { + assertSumIsQueryable(Map.of("DAANSE_JDBC_SETTINGS", "access_mode=READ_ONLY,threads=2"), MODE_NOT_WRITABLE); + } + + /** Replaces the read-only default instead of contradicting it. */ + @Test + void accessModeReadWriteIsQueryable() throws Exception { + assertSumIsQueryable(Map.of("DAANSE_JDBC_ACCESS_MODE", "READ_WRITE"), MODE_WRITABLE); + } + + @Test + void readOnlyFalseIsQueryable() throws Exception { + assertSumIsQueryable(Map.of("DAANSE_JDBC_READ_ONLY", "false"), MODE_WRITABLE); + } + + /** The Fact table of the catalog only exists as the view the init file creates. */ + @Test + void sessionInitSqlFileIsRun() throws Exception { + Path viewless = tempDir.resolve("viewless.duckdb"); + try (Connection connection = DriverManager.getConnection("jdbc:duckdb:" + viewless); + Statement statement = connection.createStatement()) { + statement.executeUpdate("CREATE TABLE \"FactData\" (\"KEY\" VARCHAR, \"VALUE\" INTEGER)"); + statement.executeUpdate("INSERT INTO \"FactData\" VALUES ('A', 1), ('B', 2), ('C', 3)"); + } + Path initSql = tempDir.resolve("init.sql"); + Files.writeString(initSql, "CREATE OR REPLACE VIEW \"Fact\" AS SELECT * FROM \"FactData\";"); + + assertSumIsQueryable(Map.of("DAANSE_JDBC_ACCESS_MODE", "READ_WRITE", "DAANSE_JDBC_SESSION_INIT_SQL_FILE", + "/app/init/init.sql"), viewless, MODE_WRITABLE, initSql); + } + + private static void assertSumIsQueryable(Map env, int databaseFileMode) throws Exception { + assertSumIsQueryable(env, databaseFile, databaseFileMode, null); + } - try (GenericContainer pivot = new GenericContainer<>(PivotContainers.pivotImage("duckdb")) + private static void assertSumIsQueryable(Map env, Path database, int databaseFileMode, + Path initSql) throws Exception { + try (GenericContainer pivot = new GenericContainer<>(image) .withCopyFileToContainer(MountableFile.forClasspathResource("catalog.xmi"), "/app/catalog/catalog.xmi") - .withCopyFileToContainer(MountableFile.forHostPath(databaseFile), "/app/data/database.duckdb") + .withCopyFileToContainer(MountableFile.forHostPath(database, databaseFileMode), + "/app/data/database.duckdb") + .withEnv(env) .withExposedPorts(8080) .waitingFor(Wait.forListeningPort())) { + if (initSql != null) { + pivot.withCopyFileToContainer(MountableFile.forHostPath(initSql), "/app/init/init.sql"); + } pivot.start(); String response = PivotContainers.awaitMdxCell(pivot.getHost(), pivot.getMappedPort(8080), diff --git a/application/pivot/h2/daanse.pivot.h2.bndrun b/application/pivot/h2/daanse.pivot.h2.bndrun index f5f156e..f389cbc 100644 --- a/application/pivot/h2/daanse.pivot.h2.bndrun +++ b/application/pivot/h2/daanse.pivot.h2.bndrun @@ -28,7 +28,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -60,6 +59,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/mariadb/daanse.pivot.mariadb.bndrun b/application/pivot/mariadb/daanse.pivot.mariadb.bndrun index f5f3c29..2d04d31 100644 --- a/application/pivot/mariadb/daanse.pivot.mariadb.bndrun +++ b/application/pivot/mariadb/daanse.pivot.mariadb.bndrun @@ -28,7 +28,6 @@ mariadb-java-client;version='[3.5.5,3.5.6)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -60,6 +59,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/mssql/daanse.pivot.mssql.bndrun b/application/pivot/mssql/daanse.pivot.mssql.bndrun index 5581d9a..e56b224 100644 --- a/application/pivot/mssql/daanse.pivot.mssql.bndrun +++ b/application/pivot/mssql/daanse.pivot.mssql.bndrun @@ -28,7 +28,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -60,6 +59,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/mysql/daanse.pivot.mysql.bndrun b/application/pivot/mysql/daanse.pivot.mysql.bndrun index 8ad1eaa..5baeff3 100644 --- a/application/pivot/mysql/daanse.pivot.mysql.bndrun +++ b/application/pivot/mysql/daanse.pivot.mysql.bndrun @@ -28,7 +28,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -60,6 +59,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/oracle/daanse.pivot.oracle.bndrun b/application/pivot/oracle/daanse.pivot.oracle.bndrun index 750665a..fabbe69 100644 --- a/application/pivot/oracle/daanse.pivot.oracle.bndrun +++ b/application/pivot/oracle/daanse.pivot.oracle.bndrun @@ -27,7 +27,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -59,6 +58,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/pivot/postgres/daanse.pivot.postgres.bndrun b/application/pivot/postgres/daanse.pivot.postgres.bndrun index e5c292d..ecf7b8d 100644 --- a/application/pivot/postgres/daanse.pivot.postgres.bndrun +++ b/application/pivot/postgres/daanse.pivot.postgres.bndrun @@ -27,7 +27,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -59,6 +58,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/playground/daanse.playground.bndrun b/application/playground/daanse.playground.bndrun index 1755ade..a668baa 100644 --- a/application/playground/daanse.playground.bndrun +++ b/application/playground/daanse.playground.bndrun @@ -83,7 +83,6 @@ com.zaxxer.HikariCP;version='[7.1.0,7.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.configadmin.plugin.interpolation;version='[1.2.8,1.2.9)',\ org.apache.felix.fileinstall;version='[3.7.4,3.7.5)',\ @@ -122,6 +121,7 @@ org.eclipse.daanse.olap.api;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.xmla.connector;version='[0.0.1,0.0.2)',\ diff --git a/application/probe/daanse.probe.bndrun b/application/probe/daanse.probe.bndrun index 2c56076..d7bfb0f 100644 --- a/application/probe/daanse.probe.bndrun +++ b/application/probe/daanse.probe.bndrun @@ -86,7 +86,6 @@ de.siegmar.fastcsv;version='[3.1.0,3.1.1)',\ net.sf.jsqlparser;version='[5.3.167,5.3.168)',\ org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\ - org.apache.commons.commons-collections4;version='[4.5.0,4.5.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.http.jetty12;version='[2.0.4,2.0.5)',\ org.apache.felix.http.servlet-api;version='[6.1.0,6.1.1)',\ @@ -127,6 +126,7 @@ org.eclipse.daanse.olap.check.runtime;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.common;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.format;version='[0.0.1,0.0.2)',\ + org.eclipse.daanse.olap.function;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.odc;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.spi;version='[0.0.1,0.0.2)',\ org.eclipse.daanse.olap.util.format;version='[0.0.1,0.0.2)',\