Search in sources :

Example 11 with Connection

use of mondrian.olap.Connection in project mondrian by pentaho.

the class TestContext method databaseIsValid.

/**
 * Tests whether the database is valid. Allows tests that depend on optional
 * databases to figure out whether to proceed.
 *
 * @return whether a database is present and correct
 */
public boolean databaseIsValid() {
    try {
        Connection connection = getConnection();
        String cubeName = getDefaultCubeName();
        if (cubeName.indexOf(' ') >= 0) {
            cubeName = Util.quoteMdxIdentifier(cubeName);
        }
        Query query = connection.parseQuery("select from " + cubeName);
        Result result = connection.execute(query);
        Util.discard(result);
        connection.close();
        return true;
    } catch (RuntimeException e) {
        Util.discard(e);
        return false;
    }
}
Also used : Connection(mondrian.olap.Connection)

Example 12 with Connection

use of mondrian.olap.Connection in project mondrian by pentaho.

the class BatchTestCase method checkNative.

/**
 * Runs a query twice, with native crossjoin optimization enabled and
 * disabled. If both results are equal,and both aggree with the expected
 * result, it is considered correct.
 *
 * <p>Optionally the query can be run with
 * fresh connection. This is useful if the test case sets its certain
 * mondrian properties, e.g. native properties like:
 * mondrian.native.filter.enable
 *
 * @param resultLimit     Maximum result size of all the MDX operations in
 *                        this query. This might be hard to estimate as it
 *                        is usually larger than the rowCount of the final
 *                        result. Setting it to 0 will cause this limit to
 *                        be ignored.
 * @param rowCount        Number of rows returned. (That is, the number
 *                        of positions on the last axis of the query.)
 * @param mdx             Query
 * @param expectedResult  Expected result string
 * @param freshConnection Whether fresh connection is required
 */
protected void checkNative(int resultLimit, int rowCount, String mdx, String expectedResult, boolean freshConnection) {
    // 'level.getMembers()' which create false negatives in this test.
    if (MondrianProperties.instance().TestExpDependencies.get() > 0) {
        return;
    }
    getConnection().getCacheControl(null).flushSchemaCache();
    try {
        Logger.getLogger(getClass()).debug("*** Native: " + mdx);
        boolean reuseConnection = !freshConnection;
        Connection con = getTestContext().withSchemaPool(reuseConnection).getConnection();
        RolapNativeRegistry reg = getRegistry(con);
        reg.useHardCache(true);
        TestListener listener = new TestListener();
        reg.setListener(listener);
        reg.setEnabled(true);
        TestCase c = new TestCase(con, resultLimit, rowCount, mdx);
        Result result = c.run();
        String nativeResult = TestContext.toString(result);
        if (!listener.isFoundEvaluator()) {
            fail("expected native execution of " + mdx);
        }
        if (!listener.isExecuteSql()) {
            fail("cache is empty: expected SQL query to be executed");
        }
        if (MondrianProperties.instance().EnableRolapCubeMemberCache.get()) {
            // run once more to make sure that the result comes from cache
            // now
            listener.setExecuteSql(false);
            c.run();
            if (listener.isExecuteSql()) {
                fail("expected result from cache when query runs twice");
            }
        }
        con.close();
        Logger.getLogger(getClass()).debug("*** Interpreter: " + mdx);
        getConnection().getCacheControl(null).flushSchemaCache();
        con = getTestContext().withSchemaPool(false).getConnection();
        reg = getRegistry(con);
        listener.setFoundEvaluator(false);
        reg.setListener(listener);
        // disable RolapNativeSet
        reg.setEnabled(false);
        result = executeQuery(mdx, con);
        String interpretedResult = TestContext.toString(result);
        if (listener.isFoundEvaluator()) {
            fail("did not expect native executions of " + mdx);
        }
        if (expectedResult != null) {
            TestContext.assertEqualsVerbose(expectedResult, nativeResult, false, "Native implementation returned different result than " + "expected; MDX=" + mdx);
            TestContext.assertEqualsVerbose(expectedResult, interpretedResult, false, "Interpreter implementation returned different result than " + "expected; MDX=" + mdx);
        }
        if (!nativeResult.equals(interpretedResult)) {
            TestContext.assertEqualsVerbose(interpretedResult, nativeResult, false, "Native implementation returned different result than " + "interpreter; MDX=" + mdx);
        }
    } finally {
        Connection con = getConnection();
        RolapNativeRegistry reg = getRegistry(con);
        reg.setEnabled(true);
        reg.useHardCache(false);
    }
}
Also used : FoodMartTestCase(mondrian.test.FoodMartTestCase) Connection(mondrian.olap.Connection) Result(mondrian.olap.Result)

Example 13 with Connection

use of mondrian.olap.Connection in project mondrian by pentaho.

the class BatchTestCase method assertQuerySqlOrNot.

/**
 * During MDX query parse and execution, checks that the query results
 * (or does not result) in a particular SQL statement being generated.
 *
 * <p>Parses and executes the MDX query once for each SQL
 * pattern in the current dialect. If there are multiple patterns, runs the
 * MDX query multiple times, and expects to see each SQL statement appear.
 * If there are no patterns in this dialect, the test trivially succeeds.
 *
 * @param testContext non-default test context if required
 * @param mdxQuery MDX query
 * @param patterns Set of patterns
 * @param negative false to assert if SQL is generated;
 *                 true to assert if SQL is NOT generated
 * @param bypassSchemaCache whether to grab a new connection and bypass the
 *        schema cache before parsing the MDX query
 * @param clearCache whether to clear cache before executing the MDX query
 */
protected void assertQuerySqlOrNot(TestContext testContext, String mdxQuery, SqlPattern[] patterns, boolean negative, boolean bypassSchemaCache, boolean clearCache) {
    Connection connection = testContext.getConnection();
    mdxQuery = testContext.upgradeQuery(mdxQuery);
    // Run the test once for each pattern in this dialect.
    // (We could optimize and run it once, collecting multiple queries, and
    // comparing all queries at the end.)
    Dialect dialect = testContext.getDialect();
    Dialect.DatabaseProduct d = dialect.getDatabaseProduct();
    boolean patternFound = false;
    for (SqlPattern sqlPattern : patterns) {
        if (!sqlPattern.hasDatabaseProduct(d)) {
            // message if required.
            continue;
        }
        patternFound = true;
        String sql = sqlPattern.getSql();
        String trigger = sqlPattern.getTriggerSql();
        sql = dialectize(d, sql);
        trigger = dialectize(d, trigger);
        // Create a dummy DataSource which will throw a 'bomb' if it is
        // asked to execute a particular SQL statement, but will otherwise
        // behave exactly the same as the current DataSource.
        final TriggerHook hook = new TriggerHook(trigger);
        RolapUtil.setHook(hook);
        Bomb bomb = null;
        try {
            if (bypassSchemaCache) {
                connection = testContext.withSchemaPool(false).getConnection();
            }
            final Query query = connection.parseQuery(mdxQuery);
            if (clearCache) {
                clearCache((RolapCube) query.getCube());
            }
            final Result result = connection.execute(query);
            Util.discard(result);
            bomb = null;
        } catch (Bomb e) {
            bomb = e;
        } catch (RuntimeException e) {
            // Walk up the exception tree and see if the root cause
            // was a SQL bomb.
            bomb = Util.getMatchingCause(e, Bomb.class);
            if (bomb == null) {
                throw e;
            }
        } finally {
            RolapUtil.setHook(null);
        }
        if (negative) {
            if (bomb != null || hook.foundMatch()) {
                fail("forbidden query [" + sql + "] detected");
            }
        } else {
            if (bomb == null && !hook.foundMatch()) {
                fail("expected query [" + sql + "] did not occur");
            }
            if (bomb != null) {
                assertEquals(replaceQuotes(sql.replaceAll("\r\n", "\n")), replaceQuotes(bomb.sql.replaceAll("\r\n", "\n")));
            }
        }
    }
    // dialect.
    if (!patternFound) {
        String warnDialect = MondrianProperties.instance().WarnIfNoPatternForDialect.get();
        if (warnDialect.equals(d.toString())) {
            System.out.println("[No expected SQL statements found for dialect \"" + dialect.toString() + "\" and test not run]");
        }
    }
}
Also used : Query(mondrian.olap.Query) SqlPattern(mondrian.test.SqlPattern) Connection(mondrian.olap.Connection) Dialect(mondrian.spi.Dialect) Result(mondrian.olap.Result)

Example 14 with Connection

use of mondrian.olap.Connection in project mondrian by pentaho.

the class BatchTestCase method checkNotNative.

/**
 * Makes sure the MDX runs correctly and not in native mode.
 *
 * @param rowCount       Number of rows returned
 * @param mdx            Query
 * @param expectedResult Expected result string
 */
protected void checkNotNative(int rowCount, String mdx, String expectedResult) {
    getConnection().getCacheControl(null).flushSchemaCache();
    Connection con = getTestContext().withSchemaPool(false).getConnection();
    RolapNativeRegistry reg = getRegistry(con);
    reg.setListener(new Listener() {

        public void foundEvaluator(NativeEvent e) {
            fail("should not be executed native");
        }

        public void foundInCache(TupleEvent e) {
        }

        public void executingSql(TupleEvent e) {
        }
    });
    TestCase c = new TestCase(con, 0, rowCount, mdx);
    Result result = c.run();
    if (expectedResult != null) {
        String nonNativeResult = TestContext.toString(result);
        if (!nonNativeResult.equals(expectedResult)) {
            TestContext.assertEqualsVerbose(expectedResult, nonNativeResult, false, "Non Native implementation returned different result than " + "expected; MDX=" + mdx);
        }
    }
}
Also used : FoodMartTestCase(mondrian.test.FoodMartTestCase) Connection(mondrian.olap.Connection) Result(mondrian.olap.Result)

Example 15 with Connection

use of mondrian.olap.Connection in project mondrian by pentaho.

the class BatchTestCase method getCube.

protected RolapCube getCube(final String cube) {
    final Connection connection = getFoodMartConnection();
    final boolean fail = true;
    return (RolapCube) connection.getSchema().lookupCube(cube, fail);
}
Also used : Connection(mondrian.olap.Connection)

Aggregations

Connection (mondrian.olap.Connection)38 RolapConnection (mondrian.rolap.RolapConnection)8 Util (mondrian.olap.Util)5 MondrianException (mondrian.olap.MondrianException)4 Result (mondrian.olap.Result)4 Member (mondrian.olap.Member)3 Query (mondrian.olap.Query)3 MDXConnection (org.pentaho.platform.plugin.services.connections.mondrian.MDXConnection)3 MemberExpr (mondrian.mdx.MemberExpr)2 Cube (mondrian.olap.Cube)2 QueryAxis (mondrian.olap.QueryAxis)2 TestMember (mondrian.olap.fun.TestMember)2 Execution (mondrian.server.Execution)2 FoodMartTestCase (mondrian.test.FoodMartTestCase)2 TestContext (mondrian.test.TestContext)2 OlapConnection (org.olap4j.OlapConnection)2 IMondrianCatalogService (org.pentaho.platform.plugin.action.mondrian.catalog.IMondrianCatalogService)2 MondrianCatalog (org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalog)2 SQLException (java.sql.SQLException)1 Properties (java.util.Properties)1