private void checkForSharedSourceCommand(AccessNode aNode) { // create a top level key to avoid the full command toString String modelName = aNode.getModelName(); Command cmd = aNode.getCommand(); // don't share full scans against internal sources, it's a waste of buffering if (CoreConstants.SYSTEM_MODEL.equals(modelName) || CoreConstants.SYSTEM_ADMIN_MODEL.equals(modelName) || TempMetadataAdapter.TEMP_MODEL.getName().equals(modelName)) { if (!(cmd instanceof Query)) { return; } Query query = (Query) cmd; if (query.getOrderBy() == null && query.getCriteria() == null) { return; } } AccessNode other = sharedCommands.get(cmd); if (other == null) { sharedCommands.put(cmd, aNode); } else { if (other.info == null) { other.info = new RegisterRequestParameter.SharedAccessInfo(); other.info.id = sharedId.getAndIncrement(); } other.info.sharingCount++; aNode.info = other.info; } }
private Command aliasCommand(AccessNode aNode, Command command, Object modelID) throws TeiidComponentException, QueryPlannerException { 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(); if (sh != null && aliasGroups) { VDBMetaData vdb = context.getDQPWorkContext().getVDB(); ModelMetaData model = vdb.getModel(aNode.getModelName()); List<String> sourceNames = model.getSourceNames(); SpecificHint sp = null; if (sourceNames.size() == 1) { sp = sh.getSpecificHint(sourceNames.get(0)); } if (sh.isUseAliases() || (sp != null && sp.isUseAliases())) { visitor.setAliasMapping(context.getAliasMapping()); } } List<Reference> references = ReferenceCollectorVisitor.getReferences(command); if (!references.isEmpty()) { Set<String> correleatedGroups = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); for (Reference ref : references) { if (ref.isCorrelated() && ref.getExpression().getGroupSymbol() != null) { correleatedGroups.add(ref.getExpression().getGroupSymbol().getName()); } } visitor.setCorrelationGroups(correleatedGroups); } command.acceptVisitor(visitor); } catch (QueryMetadataException err) { throw new TeiidComponentException(QueryPlugin.Event.TEIID30249, err); } catch (TeiidRuntimeException e) { if (e.getCause() instanceof QueryPlannerException) { throw (QueryPlannerException) e.getCause(); } throw e; } return command; }