@Test public void testSupportsAggregate5() throws Exception { BasicSourceCapabilities caps = new BasicSourceCapabilities(); caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true); caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, true); caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, false); AggregateSymbol aggregate = new AggregateSymbol(NonReserved.COUNT, false, null); //$NON-NLS-1$ helpTestSupportsAggregateFunction(caps, aggregate, false); }
public static BasicSourceCapabilities convertCapabilities(ExecutionFactory srcCaps, Object connectorID) { BasicSourceCapabilities tgtCaps = new BasicSourceCapabilities(); tgtCaps.setTranslator(srcCaps); tgtCaps.setCapabilitySupport(Capability.QUERY_SELECT_EXPRESSION, srcCaps.supportsSelectExpression()); tgtCaps.setCapabilitySupport(Capability.QUERY_SELECT_DISTINCT, srcCaps.supportsSelectDistinct()); tgtCaps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, srcCaps.supportsAliasedTable()); tgtCaps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, srcCaps.supportsInnerJoins()); setSupports(connectorID, tgtCaps, Capability.QUERY_FROM_JOIN_SELFJOIN, srcCaps.supportsSelfJoins(), Capability.QUERY_FROM_GROUP_ALIAS); tgtCaps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, srcCaps.supportsOuterJoins()); tgtCaps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER_FULL, srcCaps.supportsFullOuterJoins()); setSupports(connectorID, tgtCaps, Capability.QUERY_FROM_INLINE_VIEWS, srcCaps.supportsInlineViews(), Capability.QUERY_FROM_GROUP_ALIAS); tgtCaps.setCapabilitySupport(Capability.CRITERIA_COMPARE_EQ, srcCaps.supportsCompareCriteriaEquals()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_COMPARE_ORDERED, srcCaps.supportsCompareCriteriaOrdered()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_LIKE, srcCaps.supportsLikeCriteria()); setSupports(connectorID, tgtCaps, Capability.CRITERIA_LIKE_ESCAPE, srcCaps.supportsLikeCriteriaEscapeCharacter(), Capability.CRITERIA_LIKE); tgtCaps.setCapabilitySupport(Capability.CRITERIA_IN, srcCaps.supportsInCriteria() || (srcCaps.supportsCompareCriteriaEquals() && srcCaps.supportsOrCriteria())); tgtCaps.setCapabilitySupport(Capability.CRITERIA_IN_SUBQUERY, srcCaps.supportsInCriteriaSubquery()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_ISNULL, srcCaps.supportsIsNullCriteria()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_OR, srcCaps.supportsOrCriteria()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_NOT, srcCaps.supportsNotCriteria()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_EXISTS, srcCaps.supportsExistsCriteria()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_QUANTIFIED_SOME, srcCaps.supportsQuantifiedCompareCriteriaSome()); tgtCaps.setCapabilitySupport(Capability.CRITERIA_QUANTIFIED_ALL, srcCaps.supportsQuantifiedCompareCriteriaAll()); tgtCaps.setCapabilitySupport(Capability.QUERY_ORDERBY, srcCaps.supportsOrderBy()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_SUM, srcCaps.supportsAggregatesSum()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_AVG, srcCaps.supportsAggregatesAvg()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MIN, srcCaps.supportsAggregatesMin()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, srcCaps.supportsAggregatesMax()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, srcCaps.supportsAggregatesCount()); tgtCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, srcCaps.supportsAggregatesCountStar());
public void testPutGet() { BasicSourceCapabilities caps = new BasicSourceCapabilities(); // Check initial state assertEquals("Default value for capability should be false", false, caps.supportsCapability(Capability.QUERY_FROM_JOIN_INNER)); //$NON-NLS-1$ // Change state caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, true); // Check current state assertEquals("Changed value for capability should be true", true, caps.supportsCapability(Capability.QUERY_FROM_JOIN_INNER)); //$NON-NLS-1$ }
private static void setSupports(Object connectorID, BasicSourceCapabilities tgtCaps, Capability cap, boolean supports, Capability... required) { if (!supports) { return; } for (Capability capability : required) { if (!tgtCaps.supportsCapability(capability)) { LogManager.logWarning(LogConstants.CTX_CONNECTOR, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30003, cap, capability, connectorID)); supports = false; } } tgtCaps.setCapabilitySupport(cap, supports); }
public ProcessorPlan helpTestMultiSourcePlan(QueryMetadataInterface metadata, String userSql, String multiModel, int sourceCount, ProcessorDataManager dataMgr, List<?>[] expectedResults, VDBMetaData vdb, List<?> params, Options options) throws Exception { BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities(); bsc.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true); bsc.setCapabilitySupport(Capability.ROW_LIMIT, true); bsc.setCapabilitySupport(Capability.QUERY_GROUP_BY, true); bsc.setFunctionSupport(SourceSystemFunctions.CONCAT, true); return helpTestMultiSourcePlan(metadata, userSql, multiModel, sourceCount, dataMgr, expectedResults, vdb, params, options, bsc); }
/** * Shows the pushdown is inhibited due to lack of support */ @Test public void testSubuqeryOn1() throws Exception { BasicSourceCapabilities bsc = getTypicalCapabilities(); bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, true); bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, true); bsc.setSourceProperty(Capability.JOIN_CRITERIA_ALLOWED, ExecutionFactory.SupportedJoinCriteria.ANY); bsc.setCapabilitySupport(Capability.QUERY_SUBQUERIES_CORRELATED, true); bsc.setCapabilitySupport(Capability.CRITERIA_EXISTS, true); bsc.setCapabilitySupport(Capability.QUERY_FROM_ANSI_JOIN, true); TestOptimizer.helpPlan("SELECT 1 FROM bqt1.smalla as Y93 LEFT OUTER JOIN bqt1.smallb as AG5 ON EXISTS (SELECT 'Y' FROM bqt1.mediuma WHERE AG5.intkey = 1 AND Y93.intkey = 1 )", //$NON-NLS-1$ RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(bsc), new String[] { "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0", "SELECT g_0.IntKey FROM BQT1.SmallB AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ }
@Test public void testScalarFunction1() throws Exception { TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Object modelID = metadata.getMetadataStore().getSchema("PM1"); FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); BasicSourceCapabilities caps = new BasicSourceCapabilities(); caps.setCapabilitySupport(Capability.CRITERIA_COMPARE_EQ, true); caps.setFunctionSupport("curtime", true); //$NON-NLS-1$ capFinder.addCapabilities("pm1", caps); helpTestVisitor("curtime() = {t'10:00:00'}", modelID, metadata, capFinder, true, false); }
@Test public void testOuterRestriction() throws Exception { String sql = "select pm1.g1.e2, pm1.g2.e2 from pm1.g1 inner join pm1.g2 on (pm1.g1.e2 + pm1.g2.e2 = 5)"; //$NON-NLS-1$ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, false); caps.setCapabilitySupport(Capability.CRITERIA_ISNULL, false); caps.setSourceProperty(Capability.JOIN_CRITERIA_ALLOWED, SupportedJoinCriteria.ANY); caps.setFunctionSupport("+", true); //$NON-NLS-1$ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), new String[] {"SELECT g_0.e2 FROM pm1.g2 AS g_0", "SELECT g_0.e2 FROM pm1.g1 AS g_0"}, capFinder, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$ }
@Test public void testSetCriteria8() throws Exception { TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Object modelID = metadata.getMetadataStore().getSchema("PM1"); FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); BasicSourceCapabilities caps = new BasicSourceCapabilities(); caps.setCapabilitySupport(Capability.CRITERIA_IN, true); caps.setSourceProperty(Capability.MAX_IN_CRITERIA_SIZE, new Integer(2)); capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ helpTestVisitor("pm1.g1.e1 IN ('x', 'y', 'z')", modelID, metadata, capFinder, true, false); //$NON-NLS-1$ caps.setSourceProperty(Capability.MAX_DEPENDENT_PREDICATES, 1); helpTestVisitor("pm1.g1.e1 IN ('x', 'y', 'z')", modelID, metadata, capFinder, false, false); //$NON-NLS-1$ }
@Test public void testParseFormatNameCase() throws Exception { BasicSourceCapabilities caps = getTypicalCapabilities(); caps.setCapabilitySupport(Capability.ONLY_FORMAT_LITERALS, true); caps.setFunctionSupport(SourceSystemFunctions.FORMATTIMESTAMP, true); caps.setTranslator(new ExecutionFactory<Object, Object> () { @Override public boolean supportsFormatLiteral(String literal,
@Test public void testSupportsScalar3() throws Exception { BasicSourceCapabilities caps = new BasicSourceCapabilities(); caps.setFunctionSupport("now", false); //$NON-NLS-1$ Function func = new Function("NOW", new Expression[] { }); //$NON-NLS-1$ helpTestSupportsScalar(caps, func, false); }
@Test public void testNestedTableNoSourcesMerge() throws Exception { BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); caps.setFunctionSupport("convert", true); //$NON-NLS-1$ caps.setFunctionSupport("array_get", true); //$NON-NLS-1$ ProcessorPlan plan = TestOptimizer.helpPlan("select z.* from pm1.g1, arraytable(cast(pm1.g1.e1 as object) COLUMNS one integer, two integer, three integer) as z", //$NON-NLS-1$ RealMetadataFactory.example1Cached(), new String[] { "SELECT convert(array_get(convert(g_0.e1, object), 1), integer), convert(array_get(convert(g_0.e1, object), 2), integer), convert(array_get(convert(g_0.e1, object), 3), integer) FROM pm1.g1 AS g_0 WHERE convert(g_0.e1, object) IS NOT NULL"}, new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); }
public TempCapabilitiesFinder(CapabilitiesFinder delegate, NullOrder nullOrder) { this.delegate = delegate; if (nullOrder != NullOrder.LOW) { tempCaps = defaultCapabilities(); tempCaps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, nullOrder); } }
@Test public void testDDLProcTransactionNonTransactionalJoin() throws Exception { String ddl = "create foreign procedure proc () returns table(col string);" + "create virtual procedure virt() as begin select * from proc, proc as x; end"; //$NON-NLS-1$ TransformationMetadata metadata = RealMetadataFactory.fromDDL(ddl, "x", "y"); String userQuery = "EXEC virt()"; //$NON-NLS-1$ ProcessorPlan plan = getProcedurePlan(userQuery, metadata); assertTrue(plan.requiresTransaction(false)); BasicSourceCapabilities bsc = new BasicSourceCapabilities(); bsc.setSourceProperty(Capability.TRANSACTION_SUPPORT, TransactionSupport.NONE); plan = getProcedurePlan(userQuery, metadata, new DefaultCapabilitiesFinder(bsc)); assertFalse(plan.requiresTransaction(false)); }
@Test public void testCTESupport() throws Exception { final AtomicBoolean bool = new AtomicBoolean(false); ExecutionFactory<Object, Object> ef = new ExecutionFactory<Object, Object>(){ @Override public boolean supportsCommonTableExpressions() { return bool.get(); } @Override public boolean supportsRecursiveCommonTableExpressions() { return true; } }; ef.start(); BasicSourceCapabilities bsc = CapabilitiesConverter.convertCapabilities(ef, "conn"); //$NON-NLS-1$ assertFalse(bsc.supportsCapability(Capability.RECURSIVE_COMMON_TABLE_EXPRESSIONS)); bool.set(true); bsc = CapabilitiesConverter.convertCapabilities(ef, "conn"); //$NON-NLS-1$ assertTrue(bsc.supportsCapability(Capability.RECURSIVE_COMMON_TABLE_EXPRESSIONS)); } }
@Test public void testConverts() throws Exception { ExecutionFactory<Object, Object> ef = new ExecutionFactory<Object, Object>(){ @Override public boolean supportsConvert(int fromType, int toType) { return false; } @Override public List<String> getSupportedFunctions() { return Arrays.asList("convert"); } }; ef.start(); BasicSourceCapabilities bsc = CapabilitiesConverter.convertCapabilities(ef, "conn"); //$NON-NLS-1$ assertTrue(bsc.supportsFunction("convert")); //$NON-NLS-1$ assertFalse(bsc.supportsConvert(TypeFacility.RUNTIME_CODES.BIG_DECIMAL, TypeFacility.RUNTIME_CODES.BIG_INTEGER)); }
@Test public void testPushdownFunctionSupport() throws Exception { ExecutionFactory<Object, Object> ef = new ExecutionFactory<Object, Object>(){ @Override public void start() throws TranslatorException { super.start(); addPushDownFunction("ns", "func", DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING); } }; ef.start(); BasicSourceCapabilities bsc = CapabilitiesConverter.convertCapabilities(ef, "conn"); //$NON-NLS-1$ assertTrue("Did not get expected capabilities", bsc.supportsFunction("ns.func")); //$NON-NLS-1$ //$NON-NLS-2$ }
@Test public void testOuterRestrictionMultiLevel() throws Exception { String ddl = "create foreign table g1 (e1 integer primary key, e2 integer); " + "create foreign table g2 (e1 integer primary key, e2 integer, FOREIGN KEY (e2) REFERENCES g1 (e1));" + "create foreign table g3 (e1 integer primary key, e2 integer, FOREIGN KEY (e2) REFERENCES g2 (e1));"; String sql = "select g1.e2, g2.e2 from g1, g2, g3 where g1.e1 = g2.e2 and g2.e1 = g3.e2"; //$NON-NLS-1$ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, false); caps.setSourceProperty(Capability.JOIN_CRITERIA_ALLOWED, SupportedJoinCriteria.KEY); TestOptimizer.helpPlan(sql, RealMetadataFactory.fromDDL(ddl, "x", "y"), new String[] {"SELECT g_1.e2, g_2.e2 FROM y.g3 AS g_0 LEFT OUTER JOIN (y.g1 AS g_1 LEFT OUTER JOIN y.g2 AS g_2 ON g_1.e1 = g_2.e2) ON g_2.e1 = g_0.e2 WHERE g_2.e2 IS NOT NULL"}, new DefaultCapabilitiesFinder(caps), TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$ }
/** * since curtime is command deterministic and not supported, it will be evaluated */ @Test public void testScalarFunction2a() throws Exception { TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Object modelID = metadata.getMetadataStore().getSchema("PM1"); FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); BasicSourceCapabilities caps = new BasicSourceCapabilities(); caps.setCapabilitySupport(Capability.CRITERIA_COMPARE_EQ, true); caps.setFunctionSupport("curtime", false); //$NON-NLS-1$ capFinder.addCapabilities("pm1", caps); helpTestVisitor("curtime() = {t'10:00:00'}", modelID, metadata, capFinder, true, false); }
@Test public void testRecursivePushdown() throws TeiidComponentException, TeiidProcessingException { String sql = "WITH t(n) AS ( select e2 from pm1.g1 UNION SELECT n+1 FROM t WHERE n < 64 ) SELECT n FROM t"; //$NON-NLS-1$ BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities(); bsc.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true); bsc.setCapabilitySupport(Capability.RECURSIVE_COMMON_TABLE_EXPRESSIONS, true); bsc.setFunctionSupport("+", true); CapabilitiesFinder capFinder = new DefaultCapabilitiesFinder(bsc); TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), new String[] {"WITH t (n) AS (SELECT g_0.e2 FROM pm1.g1 AS g_0 UNION SELECT (g_0.n + 1) FROM t AS g_0 WHERE g_0.n < 64) SELECT g_0.n FROM t AS g_0"}, capFinder, ComparisonMode.EXACT_COMMAND_STRING); }