public static boolean supportsSelectExpression(Object modelID, QueryMetadataInterface metadata, CapabilitiesFinder capFinder) throws QueryMetadataException, TeiidComponentException { return supports(Capability.QUERY_SELECT_EXPRESSION, modelID, metadata, capFinder); }
if (!CapabilitiesUtil.supports(Capability.QUERY_FROM_PROCEDURE_TABLE, modelID, metadata, capFinder)) { return null; boolean supportsSelfJoins = CapabilitiesUtil.supportsSelfJoins(accessModelID, metadata, capFinder); if (!CapabilitiesUtil.supportsJoin(accessModelID, type, metadata, capFinder)) { return null; sjc = CapabilitiesUtil.getSupportedJoinCriteria(accessModelID, metadata, capFinder); && !CapabilitiesUtil.supports(Capability.QUERY_FROM_JOIN_INNER, accessModelID, metadata, capFinder) && (crits != null) && !crits.isEmpty()) { if (!CapabilitiesUtil.supports(Capability.CRITERIA_ISNULL, accessModelID, metadata, capFinder) || !CapabilitiesUtil.supports(Capability.CRITERIA_NOT, accessModelID, metadata, capFinder)) { return null; if (type == JoinType.JOIN_LEFT_OUTER && !CapabilitiesUtil.supports(Capability.CRITERIA_ON_SUBQUERY, accessModelID, metadata, capFinder)) { PlanNode right = children.get(1); for (PlanNode node : NodeEditor.findAllNodes(right, NodeConstants.Types.SELECT, NodeConstants.Types.SOURCE)) { } else if(!CapabilitiesUtil.isSameConnector(modelID, accessModelID, metadata, capFinder) && !isConformed(metadata, capFinder, (Set<Object>) childNode.getProperty(Info.CONFORMED_SOURCES), modelID, (Set<Object>) children.get(0).getProperty(Info.CONFORMED_SOURCES), accessModelID)) { return null; if ((!CapabilitiesUtil.supports(Capability.QUERY_FROM_JOIN_LATERAL, modelID, metadata, capFinder) || (crits != null && !crits.isEmpty() && !CapabilitiesUtil.supports(Capability.QUERY_FROM_JOIN_LATERAL_CONDITION, accessModelID, metadata, capFinder)))) { return null;
return false; if (!CapabilitiesUtil.supportsNullOrdering(metadata, capFinder, modelID, symbol)) { return false; if (!CapabilitiesUtil.supportsSetQueryOrderBy(modelID, metadata, capFinder)) { return false; if (!CapabilitiesUtil.checkElementsAreSearchable(sortCols, metadata, SupportConstants.Element.SEARCHABLE_COMPARE)) { return false; if (!isSet && !CapabilitiesUtil.supportsOrderBy(modelID, metadata, capFinder)) { return false; && !CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_UNRELATED, modelID, metadata, capFinder) && NodeEditor.findParent(accessNode, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE) == null && !compensateForUnrelated) { String collation = (String) CapabilitiesUtil.getProperty(Capability.COLLATION_LOCALE, modelID, metadata, capFinder);
if (CapabilitiesUtil.supports(Capability.NO_PROJECTION, modelID, metadata, capFinder) && FrameUtil.getNonQueryCommand(accessNode) == null) { return null; if(!CapabilitiesUtil.supportsSelectDistinct(modelID, metadata, capFinder)) { parentNode.recordDebugAnnotation("distinct is not supported by source", modelID, "cannot push dupremove", record, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return null; GroupSymbol intoGroup = (GroupSymbol)parentProject.getProperty(NodeConstants.Info.INTO_GROUP); if (intoGroup != null && parentProject.getParent() == null) { if (!parentProject.hasProperty(Info.CONSTRAINT) && CapabilitiesUtil.supports(Capability.INSERT_WITH_QUERYEXPRESSION, modelID, metadata, capFinder) && CapabilitiesUtil.isSameConnector(modelID, metadata.getModelID(intoGroup.getMetadataID()), metadata, capFinder)) { rootNode = performRaise(rootNode, accessNode, parentNode); return performRaise(rootNode, accessNode, parentProject); } else if (!CapabilitiesUtil.supportsInlineView(modelID, metadata, capFinder)) { return null;
if(!CapabilitiesUtil.supportsAggregates(groupCols, modelID, metadata, capFinder)) { groupNode.recordDebugAnnotation("group by is not supported by source", modelID, "cannot push group by", record, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return false; if (CapabilitiesUtil.supports(Capability.QUERY_ONLY_SINGLE_TABLE_GROUP_BY, modelID, metadata, capFinder) && !NodeEditor.findAllNodes(groupNode, NodeConstants.Types.JOIN, NodeConstants.Types.SOURCE).isEmpty()) { groupNode.recordDebugAnnotation("joined group by is not supported by source", modelID, "cannot push group by", record, metadata); //$NON-NLS-1$ //$NON-NLS-2$ boolean multipleDistinct = CapabilitiesUtil.supports(Capability.QUERY_GROUP_BY_MULTIPLE_DISTINCT_AGGREGATES, modelID, metadata, capFinder); if (aggregates != null) { AggregateSymbol distinct = null; if (!CapabilitiesUtil.checkElementsAreSearchable(groupCols, metadata, SupportConstants.Element.SEARCHABLE_COMPARE)) { groupNode.recordDebugAnnotation("non-searchable group by column", modelID, "cannot push group by", record, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return false; if (groupNode.hasBooleanProperty(Info.ROLLUP) && !CapabilitiesUtil.supports(Capability.QUERY_GROUP_BY_ROLLUP, modelID, metadata, capFinder)) { groupNode.recordDebugAnnotation("source does not support rollup", modelID, "cannot push group by", record, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return false;
&& !CapabilitiesUtil.supports(Capability.QUERY_SET_LIMIT_OFFSET, modelID, metadata, capFinder)) { return null; if (limit != null && !CapabilitiesUtil.supportsRowLimit(modelID, metadata, capFinder)) { parentNode.recordDebugAnnotation("limit not supported by source", modelID, "limit node not pushed", analysisRecord, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return null; if (multiSource || (offset != null && !CapabilitiesUtil.supportsRowOffset(modelID, metadata, capFinder))) {
try { command = (Command)command.clone(); boolean aliasGroups = modelID != null && (CapabilitiesUtil.supportsGroupAliases(modelID, metadata, capFinder) || CapabilitiesUtil.supports(Capability.QUERY_FROM_INLINE_VIEWS, modelID, metadata, capFinder)); boolean aliasColumns = modelID != null && (CapabilitiesUtil.supports(Capability.QUERY_SELECT_EXPRESSION, modelID, metadata, capFinder) || CapabilitiesUtil.supports(Capability.QUERY_FROM_INLINE_VIEWS, modelID, metadata, capFinder)); AliasGenerator visitor = new AliasGenerator(aliasGroups, !aliasColumns); SourceHint sh = command.getSourceHint();
return; if (! CapabilitiesUtil.supportsScalarFunction(modelID, obj, metadata, capFinder)) { if (CapabilitiesUtil.supports(Capability.ONLY_FORMAT_LITERALS, modelID, metadata, capFinder) && parseFormat.contains(name)) { return; if (!CapabilitiesUtil.getCapabilities(modelID, metadata, capFinder).supportsFormatLiteral((String)c.getValue(), StringUtil.endsWithIgnoreCase(name, DataTypeManager.DefaultDataTypes.TIMESTAMP)?Format.DATE:Format.NUMBER)) { markInvalid(obj, obj.getName() + " literal parse " + c + " not supported by source"); //$NON-NLS-1$ //$NON-NLS-2$ return;
&& CapabilitiesUtil.supports(Capability.PARTIAL_FILTERS, modelId, metadata, capFinder)) { if (modelId != null && fd.getPushdown() == PushDown.MUST_PUSHDOWN && fd.getMethod() != null && CapabilitiesUtil.isSameConnector(modelId, fd.getMethod().getParent(), metadata, capFinder)) { f.setEval(false); } else if (fd.getDeterministic() == Determinism.NONDETERMINISTIC && CapabilitiesUtil.supportsScalarFunction(modelId, f, metadata, capFinder)) { f.setEval(false);
static boolean supportsNullOrdering(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, Object modelID, OrderByItem symbol) throws QueryMetadataException, TeiidComponentException { boolean supportsNullOrdering = CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_NULL_ORDERING, modelID, metadata, capFinder); NullOrder defaultNullOrder = CapabilitiesUtil.getDefaultNullOrder(modelID, metadata, capFinder); if (symbol.getNullOrdering() != null && !supportsNullOrdering) { if (symbol.getNullOrdering() == NullOrdering.FIRST) { if (defaultNullOrder != NullOrder.FIRST && !(symbol.isAscending() && defaultNullOrder == NullOrder.LOW) && !(!symbol.isAscending() && defaultNullOrder == NullOrder.HIGH)) { return false; } } else if (defaultNullOrder != NullOrder.LAST && !(symbol.isAscending() && defaultNullOrder == NullOrder.HIGH) && !(!symbol.isAscending() && defaultNullOrder == NullOrder.LOW)) { return false; } } return true; } }
SourceCapabilities caps = getCapabilities(modelID, metadata, capFinder); if (!supportsScalarFunction(modelID, aggregate, metadata, capFinder)) { return false;
Object mid = this.context.getMetadata().getModelID(mmd.getName()); if (caps.supportsCapability(Capability.SELECT_WITHOUT_FROM) && CapabilitiesUtil.supportsScalarFunction(mid, function, this.context.getMetadata(), capabiltiesFinder)) { schema = mmd.getName(); break; if (!CapabilitiesUtil.supports(Capability.SELECT_WITHOUT_FROM, fd.getMethod().getParent(), context.getMetadata(), context.getQueryProcessorFactory().getCapabiltiesFinder())) { if (elements != null) { Integer index = (Integer) elements.get(function);
if (limit != null && !CapabilitiesUtil.supportsRowLimit(modelID, metadata, capFinder)) { parentNode.recordDebugAnnotation("limit not supported by source", modelID, "limit node not pushed", analysisRecord, metadata); //$NON-NLS-1$ //$NON-NLS-2$ return null; if (multiSource || (offset != null && !CapabilitiesUtil.supportsRowOffset(modelID, metadata, capFinder))) {
@Override public void visit(Function f) { FunctionDescriptor fd = f.getFunctionDescriptor(); if (f.isEval()) { try { if (modelId != null && fd.getPushdown() == PushDown.MUST_PUSHDOWN && fd.getMethod() != null && CapabilitiesUtil.isSameConnector(modelId, fd.getMethod().getParent(), metadata, capFinder)) { f.setEval(false); } else if (fd.getDeterministic() == Determinism.NONDETERMINISTIC && CapabilitiesUtil.supportsScalarFunction(modelId, f, metadata, capFinder)) { f.setEval(false); } } catch (QueryMetadataException e) { throw new TeiidRuntimeException(e); } catch (TeiidComponentException e) { throw new TeiidRuntimeException(e); } } } @Override
public void visit(AggregateSymbol obj) { try { if(! CapabilitiesUtil.supportsAggregateFunction(modelID, obj, metadata, capFinder)) { markInvalid(obj, "Aggregate function pushdown not supported by source"); //$NON-NLS-1$ } } catch(QueryMetadataException e) { handleException(new TeiidComponentException(e)); } catch(TeiidComponentException e) { handleException(e); } }
/** * Return a map of Access Nodes to JoinSources that may be eligible for pushdown as * joins. */ private Map<Object, List<PlanNode>> getAccessMap(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, JoinRegion joinRegion) throws QueryMetadataException, TeiidComponentException { Map<Object, List<PlanNode>> accessMap = new HashMap(); for (PlanNode node : joinRegion.getJoinSourceNodes().values()) { /* check to see if we are directly over an access node. in the event that the join source root * looks like select->access, we still won't consider this node for pushing */ if (node.getType() != NodeConstants.Types.ACCESS) { continue; } Object accessModelID = RuleRaiseAccess.getModelIDFromAccess(node, metadata); if (accessModelID == null || !CapabilitiesUtil.supportsJoin(accessModelID, JoinType.JOIN_INNER, metadata, capFinder)) { continue; } RulePlanUnions.buildModelMap(metadata, capFinder, accessMap, node, accessModelID); } return accessMap; }
public void helpTestSupportsScalar(SourceCapabilities caps, Function function, boolean expectedValue) throws QueryMetadataException, TeiidComponentException, QueryResolverException { // Set up metadata TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Schema modelID = metadata.getMetadataStore().getSchema("PM1"); // Set up capabilities FakeCapabilitiesFinder finder = new FakeCapabilitiesFinder(); finder.addCapabilities("pm1", caps); //$NON-NLS-1$ ResolverVisitor.resolveLanguageObject(function, metadata); // Test capabilities util boolean actual = CapabilitiesUtil.supportsScalarFunction(modelID, function, metadata, finder); assertEquals("Got wrong answer for supports", expectedValue, actual); //$NON-NLS-1$ }
@Test public void testSupportsDistinct1() throws Exception { // Set up metadata TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Schema modelID = metadata.getMetadataStore().getSchema("PM1"); // Set up capabilities FakeCapabilitiesFinder finder = new FakeCapabilitiesFinder(); BasicSourceCapabilities sourceCaps = new BasicSourceCapabilities(); sourceCaps.setCapabilitySupport(Capability.QUERY_SELECT_DISTINCT, true); finder.addCapabilities("pm1", sourceCaps); //$NON-NLS-1$ assertTrue(CapabilitiesUtil.supportsSelectDistinct(modelID, metadata, finder)); }
@Test public void testSupportsOrderBy1() throws Exception { // Set up metadata TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Schema modelID = metadata.getMetadataStore().getSchema("PM1"); // Set up capabilities FakeCapabilitiesFinder finder = new FakeCapabilitiesFinder(); BasicSourceCapabilities sourceCaps = new BasicSourceCapabilities(); sourceCaps.setCapabilitySupport(Capability.QUERY_ORDERBY, true); finder.addCapabilities("pm1", sourceCaps); //$NON-NLS-1$ // Test capabilities util boolean actual = CapabilitiesUtil.supportsOrderBy(modelID, metadata, finder); assertEquals("Got wrong answer for supports", true, actual); //$NON-NLS-1$ }
@Test public void testSupportRowLimit() throws Exception { // Set up metadata TransformationMetadata metadata = RealMetadataFactory.example1Cached(); Schema modelID = metadata.getMetadataStore().getSchema("PM1"); // Set up capabilities FakeCapabilitiesFinder finder = getFinder(Capability.ROW_LIMIT, false); // Test capabilities util assertEquals(false, CapabilitiesUtil.supportsRowLimit(modelID, metadata, finder)); finder = getFinder(Capability.ROW_LIMIT, true); // Test capabilities util assertEquals(true, CapabilitiesUtil.supportsRowLimit(modelID, metadata, finder)); }