From 7453f4478b10505b6734f024b12405cb8386621e Mon Sep 17 00:00:00 2001 From: "Katarina Valalikova (katkav)" Date: Sat, 11 Oct 2014 21:38:17 +0200 Subject: [PATCH] improving shadow query with disjunction - search according to secondary identifiers. --- .../custom/ShadowQueryWithDisjunction.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java index 2c3649801ee..abff1672079 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java @@ -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; @@ -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; @@ -56,6 +58,7 @@ import org.hibernate.sql.JoinType; import javax.xml.namespace.QName; + import java.util.Collection; /** @@ -85,6 +88,7 @@ public boolean match(ObjectQuery objectQuery, Class type, if (!ShadowType.class.equals(type)) { return false; } + LOGGER.info("shadow disjunction query match"); return parse(objectQuery) != null; } @@ -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; @@ -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; } @@ -155,7 +160,7 @@ public RQuery createQuery(ObjectQuery objectQuery, Class t Collection> 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); @@ -163,7 +168,7 @@ public RQuery createQuery(ObjectQuery objectQuery, Class t 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); @@ -193,6 +198,7 @@ public RQuery createQuery(ObjectQuery objectQuery, Class t cMain.setProjection(projections); cMain.setResultTransformer(GetObjectResult.RESULT_TRANSFORMER); + LOGGER.info("Criteria: {}", cMain); return new RQueryCriteriaImpl(cMain); }