Search in sources :

Example 1 with ItemPathResolver

use of com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver in project midpoint by Evolveum.

the class QueryInterpreter2 method findAndCreateRestriction.

private <T extends ObjectFilter> Restriction findAndCreateRestriction(@NotNull T filter, @NotNull InterpretationContext context, Restriction parent) throws QueryException {
    LOGGER.trace("Determining restriction for filter {}", filter);
    ItemPathResolver helper = context.getItemPathResolver();
    JpaEntityDefinition baseEntityDefinition;
    if (parent != null) {
        baseEntityDefinition = parent.getBaseHqlEntityForChildren().getJpaDefinition();
    } else {
        baseEntityDefinition = context.getRootEntityDefinition();
    }
    Restriction restriction = findAndCreateRestrictionInternal(filter, context, parent, helper, baseEntityDefinition);
    LOGGER.trace("Restriction for {} is {}", filter.getClass().getSimpleName(), restriction);
    return restriction;
}
Also used : ItemPathResolver(com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver)

Example 2 with ItemPathResolver

use of com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver in project midpoint by Evolveum.

the class ItemPathResolutionState method nextState.

/**
     * Executes transition to next state. Modifies query context by adding joins as necessary.
     *
     * Precondition: !isFinal()
     * Precondition: adequate transition exists
     *
     * @param itemDefinition Target item definition (used/required only for "any" properties)
     * @param singletonOnly Collections are forbidden
     * @return destination state - always not null
     */
public ItemPathResolutionState nextState(ItemDefinition itemDefinition, boolean singletonOnly, PrismContext prismContext) throws QueryException {
    // This is brutal hack, to be thought again.
    if (remainingItemPath.startsWith(ParentPathSegment.class) && hqlDataInstance.getParentItem() != null) {
        return new ItemPathResolutionState(remainingItemPath.tail(), hqlDataInstance.getParentItem(), itemPathResolver);
    }
    DataSearchResult<?> result = hqlDataInstance.getJpaDefinition().nextLinkDefinition(remainingItemPath, itemDefinition, prismContext);
    LOGGER.trace("nextLinkDefinition on '{}' returned '{}'", remainingItemPath, result != null ? result.getLinkDefinition() : "(null)");
    if (result == null) {
        // sorry we failed (however, this should be caught before -> so IllegalStateException)
        throw new IllegalStateException("Couldn't find '" + remainingItemPath + "' in " + hqlDataInstance.getJpaDefinition());
    }
    JpaLinkDefinition linkDefinition = result.getLinkDefinition();
    String newHqlPath = hqlDataInstance.getHqlPath();
    if (linkDefinition.hasJpaRepresentation()) {
        if (singletonOnly && linkDefinition.isMultivalued()) {
            // TODO better message + context
            throw new QueryException("Collections are not allowable for right-side paths");
        }
        if (!linkDefinition.isEmbedded() || linkDefinition.isMultivalued()) {
            LOGGER.trace("Adding join for '{}' to context", linkDefinition);
            newHqlPath = itemPathResolver.addJoin(linkDefinition, hqlDataInstance.getHqlPath());
        } else {
            newHqlPath += "." + linkDefinition.getJpaName();
        }
    }
    HqlDataInstance<?> parentDataInstance;
    if (!remainingItemPath.startsWith(ParentPathSegment.class)) {
        // TODO what about other special cases? (@, ...)
        parentDataInstance = hqlDataInstance;
    } else {
        parentDataInstance = null;
    }
    return new ItemPathResolutionState(result.getRemainder(), new HqlDataInstance<>(newHqlPath, result.getTargetDefinition(), parentDataInstance), itemPathResolver);
}
Also used : JpaLinkDefinition(com.evolveum.midpoint.repo.sql.query2.definition.JpaLinkDefinition) QueryException(com.evolveum.midpoint.repo.sql.query.QueryException) ParentPathSegment(com.evolveum.midpoint.prism.path.ParentPathSegment)

Example 3 with ItemPathResolver

use of com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver in project midpoint by Evolveum.

the class QueryInterpreter2 method findAndCreateRestrictionInternal.

private <T extends ObjectFilter> Restriction findAndCreateRestrictionInternal(T filter, InterpretationContext context, Restriction parent, ItemPathResolver resolver, JpaEntityDefinition baseEntityDefinition) throws QueryException {
    if (filter instanceof AndFilter) {
        return new AndRestriction(context, (AndFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof OrFilter) {
        return new OrRestriction(context, (OrFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof NotFilter) {
        return new NotRestriction(context, (NotFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof FullTextFilter) {
        return new FullTextRestriction(context, (FullTextFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof InOidFilter) {
        return new InOidRestriction(context, (InOidFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof OrgFilter) {
        return new OrgRestriction(context, (OrgFilter) filter, baseEntityDefinition, parent);
    } else if (filter instanceof TypeFilter) {
        TypeFilter typeFilter = (TypeFilter) filter;
        JpaEntityDefinition refinedEntityDefinition = resolver.findRestrictedEntityDefinition(baseEntityDefinition, typeFilter.getType());
        return new TypeRestriction(context, typeFilter, refinedEntityDefinition, parent);
    } else if (filter instanceof ExistsFilter) {
        ExistsFilter existsFilter = (ExistsFilter) filter;
        ItemPath path = existsFilter.getFullPath();
        ItemDefinition definition = existsFilter.getDefinition();
        ProperDataSearchResult<JpaDataNodeDefinition> searchResult = resolver.findProperDataDefinition(baseEntityDefinition, path, definition, JpaDataNodeDefinition.class, context.getPrismContext());
        if (searchResult == null) {
            throw new QueryException("Path for ExistsFilter (" + path + ") doesn't point to a hibernate entity or property within " + baseEntityDefinition);
        }
        return new ExistsRestriction(context, existsFilter, searchResult.getEntityDefinition(), parent);
    } else if (filter instanceof RefFilter) {
        RefFilter refFilter = (RefFilter) filter;
        ItemPath path = refFilter.getFullPath();
        ItemDefinition definition = refFilter.getDefinition();
        ProperDataSearchResult<JpaReferenceDefinition> searchResult = resolver.findProperDataDefinition(baseEntityDefinition, path, definition, JpaReferenceDefinition.class, context.getPrismContext());
        if (searchResult == null) {
            throw new QueryException("Path for RefFilter (" + path + ") doesn't point to a reference item within " + baseEntityDefinition);
        }
        return new ReferenceRestriction(context, refFilter, searchResult.getEntityDefinition(), parent, searchResult.getLinkDefinition());
    } else if (filter instanceof PropertyValueFilter) {
        PropertyValueFilter valFilter = (PropertyValueFilter) filter;
        ItemPath path = valFilter.getFullPath();
        ItemDefinition definition = valFilter.getDefinition();
        ProperDataSearchResult<JpaPropertyDefinition> propDefRes = resolver.findProperDataDefinition(baseEntityDefinition, path, definition, JpaPropertyDefinition.class, context.getPrismContext());
        if (propDefRes == null) {
            throw new QueryException("Couldn't find a proper data item to query, given base entity " + baseEntityDefinition + " and this filter: " + valFilter.debugDump());
        }
        // TODO can't be unified?
        if (propDefRes.getTargetDefinition() instanceof JpaAnyPropertyDefinition) {
            return new AnyPropertyRestriction(context, valFilter, propDefRes.getEntityDefinition(), parent, propDefRes.getLinkDefinition());
        } else {
            return new PropertyRestriction(context, valFilter, propDefRes.getEntityDefinition(), parent, propDefRes.getLinkDefinition());
        }
    } else if (filter instanceof NoneFilter || filter instanceof AllFilter || filter instanceof UndefinedFilter) {
        // these should be filtered out by the client
        throw new IllegalStateException("Trivial filters are not supported by QueryInterpreter: " + filter.debugDump());
    } else {
        throw new IllegalStateException("Unknown filter: " + filter.debugDump());
    }
}
Also used : ItemDefinition(com.evolveum.midpoint.prism.ItemDefinition) QueryException(com.evolveum.midpoint.repo.sql.query.QueryException) ProperDataSearchResult(com.evolveum.midpoint.repo.sql.query2.resolution.ProperDataSearchResult) ItemPath(com.evolveum.midpoint.prism.path.ItemPath)

Aggregations

QueryException (com.evolveum.midpoint.repo.sql.query.QueryException)2 ItemDefinition (com.evolveum.midpoint.prism.ItemDefinition)1 ItemPath (com.evolveum.midpoint.prism.path.ItemPath)1 ParentPathSegment (com.evolveum.midpoint.prism.path.ParentPathSegment)1 JpaLinkDefinition (com.evolveum.midpoint.repo.sql.query2.definition.JpaLinkDefinition)1 ItemPathResolver (com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver)1 ProperDataSearchResult (com.evolveum.midpoint.repo.sql.query2.resolution.ProperDataSearchResult)1