Skip to content

Commit

Permalink
improving shadow query with disjunction - search according to seconda…
Browse files Browse the repository at this point in the history
…ry identifiers.
  • Loading branch information
katkav committed Oct 11, 2014
1 parent dc339bb commit 7453f44
Showing 1 changed file with 13 additions and 7 deletions.
Expand Up @@ -18,6 +18,7 @@

import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.NameItemPathSegment;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
Expand All @@ -42,6 +43,7 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Conjunction;
Expand All @@ -56,6 +58,7 @@
import org.hibernate.sql.JoinType;

import javax.xml.namespace.QName;

import java.util.Collection;

/**
Expand Down Expand Up @@ -85,6 +88,7 @@ public boolean match(ObjectQuery objectQuery, Class<? extends ObjectType> type,
if (!ShadowType.class.equals(type)) {
return false;
}
LOGGER.info("shadow disjunction query match");
return parse(objectQuery) != null;
}

Expand All @@ -94,6 +98,7 @@ private ParsedQuery parse(ObjectQuery objectQuery) {
return null;
}

LOGGER.info("create shadow disjunction parse");
AndFilter andFilter = (AndFilter) objectQuery.getFilter();

RefFilter refFilter = null;
Expand All @@ -119,17 +124,17 @@ private ParsedQuery parse(ObjectQuery objectQuery) {

EqualFilter eqUidFilter = null;
EqualFilter eqNameFilter = null;
ItemPath uidPath = new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID);
// ItemPath uidPath = new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID);
ItemPath namePath = new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME);
for (ObjectFilter filter : orFilter.getConditions()) {
if (!(filter instanceof EqualFilter)) {
return null;
}
EqualFilter equalFilter = (EqualFilter) filter;
if (uidPath.equivalent(equalFilter.getPath())) {
eqUidFilter = equalFilter;
} else if (namePath.equivalent(equalFilter.getPath())) {
eqNameFilter = equalFilter;
if (namePath.equivalent(equalFilter.getPath())) {
eqNameFilter = equalFilter;
} else if (ShadowType.F_ATTRIBUTES.equals(((NameItemPathSegment)equalFilter.getPath().first()).getName())) {
eqUidFilter = equalFilter;
} else {
return null;
}
Expand All @@ -155,15 +160,15 @@ public RQuery createQuery(ObjectQuery objectQuery, Class<? extends ObjectType> t
Collection<SelectorOptions<GetOperationOptions>> options, boolean countingObjects,
Session session) {


LOGGER.info("create shadow disjunction query");
DetachedCriteria c1 = DetachedCriteria.forClass(ClassMapper.getHQLTypeClass(ShadowType.class), "s");
c1.createCriteria("strings", "s1", JoinType.LEFT_OUTER_JOIN);

ParsedQuery parsedQuery = parse(objectQuery);
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.eq("resourceRef.targetOid", parsedQuery.refFilter.getValues().get(0).getOid()));
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(createAttributeEq(parsedQuery.eqUidFilter, SchemaConstantsGenerated.ICF_S_UID));
disjunction.add(createAttributeEq(parsedQuery.eqUidFilter, parsedQuery.eqUidFilter.getPath().lastNamed().getName()));
disjunction.add(createAttributeEq(parsedQuery.eqNameFilter, SchemaConstantsGenerated.ICF_S_NAME));
conjunction.add(disjunction);
c1.add(conjunction);
Expand Down Expand Up @@ -193,6 +198,7 @@ public RQuery createQuery(ObjectQuery objectQuery, Class<? extends ObjectType> t
cMain.setProjection(projections);

cMain.setResultTransformer(GetObjectResult.RESULT_TRANSFORMER);
LOGGER.info("Criteria: {}", cMain);
return new RQueryCriteriaImpl(cMain);
}

Expand Down

0 comments on commit 7453f44

Please sign in to comment.