Search in sources :

Example 1 with SubqueryContainer

use of org.teiid.query.sql.lang.SubqueryContainer in project teiid by teiid.

the class QueryResolver method resolveSubqueries.

public static void resolveSubqueries(Command command, TempMetadataAdapter metadata, Collection<GroupSymbol> externalGroups) throws QueryResolverException, TeiidComponentException {
    for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(command)) {
        QueryResolver.setChildMetadata(container.getCommand(), command);
        if (externalGroups != null) {
            container.getCommand().pushNewResolvingContext(externalGroups);
        }
        QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata(), false);
    }
}
Also used : SubqueryContainer(org.teiid.query.sql.lang.SubqueryContainer)

Example 2 with SubqueryContainer

use of org.teiid.query.sql.lang.SubqueryContainer in project teiid by teiid.

the class TestExpressionEvaluator method helpTestWithValueIterator.

private void helpTestWithValueIterator(ScalarSubquery expr, List<?> values, Object expected) throws BlockedException, TeiidComponentException, ExpressionEvaluationException {
    final CollectionValueIterator valueIter = new CollectionValueIterator(values);
    CommandContext cc = new CommandContext();
    assertEquals(expected, new Evaluator(Collections.emptyMap(), null, cc) {

        @Override
        protected ValueIterator evaluateSubquery(SubqueryContainer container, List tuple) throws TeiidProcessingException, BlockedException, TeiidComponentException {
            return valueIter;
        }
    }.evaluate(expr, null));
}
Also used : SubqueryContainer(org.teiid.query.sql.lang.SubqueryContainer) CommandContext(org.teiid.query.util.CommandContext) ArrayList(java.util.ArrayList) List(java.util.List) CollectionValueIterator(org.teiid.query.sql.lang.CollectionValueIterator) Evaluator(org.teiid.query.eval.Evaluator)

Example 3 with SubqueryContainer

use of org.teiid.query.sql.lang.SubqueryContainer in project teiid by teiid.

the class ValueIteratorProviderCollectorVisitor method getValueIteratorProviders.

public static final List<SubqueryContainer<?>> getValueIteratorProviders(Collection<? extends LanguageObject> languageObjects) {
    if (languageObjects == null || languageObjects.isEmpty()) {
        return Collections.emptyList();
    }
    List<SubqueryContainer<?>> result = new LinkedList<SubqueryContainer<?>>();
    ValueIteratorProviderCollectorVisitor visitor = new ValueIteratorProviderCollectorVisitor(result);
    for (LanguageObject obj : languageObjects) {
        PreOrderNavigator.doVisit(obj, visitor);
    }
    return result;
}
Also used : SubqueryContainer(org.teiid.query.sql.lang.SubqueryContainer) LinkedList(java.util.LinkedList) LanguageObject(org.teiid.query.sql.LanguageObject)

Example 4 with SubqueryContainer

use of org.teiid.query.sql.lang.SubqueryContainer in project teiid by teiid.

the class PlanNode method getCorrelatedReferences.

public List<SymbolMap> getCorrelatedReferences() {
    List<SubqueryContainer<?>> containers = getSubqueryContainers();
    if (containers.isEmpty()) {
        return Collections.emptyList();
    }
    ArrayList<SymbolMap> result = new ArrayList<SymbolMap>(containers.size());
    for (SubqueryContainer<?> container : containers) {
        SymbolMap map = container.getCommand().getCorrelatedReferences();
        if (map != null) {
            result.add(map);
        }
    }
    return result;
}
Also used : SubqueryContainer(org.teiid.query.sql.lang.SubqueryContainer) SymbolMap(org.teiid.query.sql.util.SymbolMap)

Example 5 with SubqueryContainer

use of org.teiid.query.sql.lang.SubqueryContainer in project teiid by teiid.

the class ColumnMaskingHelper method maskColumn.

private static Expression maskColumn(ElementSymbol col, GroupSymbol unaliased, QueryMetadataInterface metadata, ExpressionMappingVisitor emv, Map<String, DataPolicy> policies, CommandContext cc) throws TeiidComponentException, TeiidProcessingException {
    Object metadataID = col.getMetadataID();
    String fullName = metadata.getFullName(metadataID);
    final GroupSymbol group = col.getGroupSymbol();
    String elementType = metadata.getElementRuntimeTypeName(col.getMetadataID());
    Class<?> expectedType = DataTypeManager.getDataTypeClass(elementType);
    List<WhenThen> cases = null;
    Collection<GroupSymbol> groups = Arrays.asList(unaliased);
    for (Map.Entry<String, DataPolicy> entry : policies.entrySet()) {
        DataPolicyMetadata dpm = (DataPolicyMetadata) entry.getValue();
        PermissionMetaData pmd = dpm.getPermissionMap().get(fullName);
        if (pmd == null) {
            continue;
        }
        String maskString = pmd.getMask();
        if (maskString == null) {
            continue;
        }
        Criteria condition = null;
        if (pmd.getCondition() != null) {
            condition = RowBasedSecurityHelper.resolveCondition(metadata, group, metadata.getFullName(group.getMetadataID()), entry, pmd, pmd.getCondition());
        } else {
            condition = QueryRewriter.TRUE_CRITERIA;
        }
        Expression mask = (Expression) pmd.getResolvedMask();
        if (mask == null) {
            try {
                mask = QueryParser.getQueryParser().parseExpression(pmd.getMask());
                for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(mask)) {
                    container.getCommand().pushNewResolvingContext(groups);
                    QueryResolver.resolveCommand(container.getCommand(), metadata, false);
                }
                ResolverVisitor.resolveLanguageObject(mask, groups, metadata);
                ValidatorReport report = Validator.validate(mask, metadata, new ValidationVisitor());
                if (report.hasItems()) {
                    ValidatorFailure firstFailure = report.getItems().iterator().next();
                    // $NON-NLS-1$
                    throw new QueryMetadataException(QueryPlugin.Event.TEIID31139, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31139, dpm.getName(), fullName) + " " + firstFailure);
                }
                if (mask.getType() != expectedType) {
                    mask = ResolverUtil.convertExpression(mask, elementType, metadata);
                }
                pmd.setResolvedMask(mask.clone());
                if (!dpm.isAnyAuthenticated()) {
                    // we treat this as user deterministic since the data roles won't change.  this may change if the logic becomes dynamic
                    // TODO: this condition may not even be used
                    cc.setDeterminismLevel(Determinism.USER_DETERMINISTIC);
                }
            } catch (QueryMetadataException e) {
                throw e;
            } catch (TeiidException e) {
                throw new QueryMetadataException(QueryPlugin.Event.TEIID31129, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31129, dpm.getName(), fullName));
            }
        } else {
            mask = (Expression) mask.clone();
        }
        if (group.getDefinition() != null) {
            PreOrPostOrderNavigator.doVisit(mask, emv, PreOrPostOrderNavigator.PRE_ORDER, true);
        }
        if (cases == null) {
            cases = new ArrayList<ColumnMaskingHelper.WhenThen>();
        }
        cases.add(new WhenThen(pmd.getOrder(), condition, mask));
    }
    if (cases == null) {
        return col;
    }
    Collections.sort(cases);
    List<Criteria> whens = new ArrayList<Criteria>();
    List<Expression> thens = new ArrayList<Expression>();
    for (WhenThen whenThen : cases) {
        whens.add(whenThen.when);
        thens.add(whenThen.then);
    }
    SearchedCaseExpression sce = new SearchedCaseExpression(whens, thens);
    sce.setElseExpression(col);
    sce.setType(expectedType);
    Expression mask = QueryRewriter.rewriteExpression(sce, cc, metadata, true);
    return mask;
}
Also used : ValidationVisitor(org.teiid.query.validator.ValidationVisitor) ArrayList(java.util.ArrayList) Criteria(org.teiid.query.sql.lang.Criteria) ValidatorFailure(org.teiid.query.validator.ValidatorFailure) DataPolicyMetadata(org.teiid.adminapi.impl.DataPolicyMetadata) DataPolicy(org.teiid.adminapi.DataPolicy) SubqueryContainer(org.teiid.query.sql.lang.SubqueryContainer) QueryMetadataException(org.teiid.api.exception.query.QueryMetadataException) ValidatorReport(org.teiid.query.validator.ValidatorReport) TeiidException(org.teiid.core.TeiidException) SearchedCaseExpression(org.teiid.query.sql.symbol.SearchedCaseExpression) SearchedCaseExpression(org.teiid.query.sql.symbol.SearchedCaseExpression) Expression(org.teiid.query.sql.symbol.Expression) GroupSymbol(org.teiid.query.sql.symbol.GroupSymbol) Map(java.util.Map) PermissionMetaData(org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData)

Aggregations

SubqueryContainer (org.teiid.query.sql.lang.SubqueryContainer)8 ArrayList (java.util.ArrayList)3 Expression (org.teiid.query.sql.symbol.Expression)3 LanguageObject (org.teiid.query.sql.LanguageObject)2 Criteria (org.teiid.query.sql.lang.Criteria)2 LinkedList (java.util.LinkedList)1 List (java.util.List)1 Map (java.util.Map)1 DataPolicy (org.teiid.adminapi.DataPolicy)1 DataPolicyMetadata (org.teiid.adminapi.impl.DataPolicyMetadata)1 PermissionMetaData (org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData)1 QueryMetadataException (org.teiid.api.exception.query.QueryMetadataException)1 QueryResolverException (org.teiid.api.exception.query.QueryResolverException)1 TeiidException (org.teiid.core.TeiidException)1 Evaluator (org.teiid.query.eval.Evaluator)1 TempMetadataAdapter (org.teiid.query.metadata.TempMetadataAdapter)1 TempMetadataStore (org.teiid.query.metadata.TempMetadataStore)1 CollectionValueIterator (org.teiid.query.sql.lang.CollectionValueIterator)1 Command (org.teiid.query.sql.lang.Command)1 DynamicCommand (org.teiid.query.sql.lang.DynamicCommand)1