Skip to content

Commit

Permalink
Working around duplicate records returned from a special kind of OR-s…
Browse files Browse the repository at this point in the history
…tyle attribute-related query.
  • Loading branch information
mederly committed Oct 10, 2014
1 parent e68fd79 commit cc4b4f6
Show file tree
Hide file tree
Showing 7 changed files with 397 additions and 25 deletions.
Expand Up @@ -94,8 +94,14 @@ public static ObjectQuery createResourceAndAccountQuery(String resourceOid, QNam
createObjectClassFilter(objectClass, prismContext));
return ObjectQuery.createObjectQuery(and);
}

public static ObjectFilter createResourceFilter(String resourceOid, PrismContext prismContext) throws SchemaException {

public static ObjectQuery createResourceQuery(String resourceOid, PrismContext prismContext) throws SchemaException {
Validate.notNull(resourceOid, "Resource where to search must not be null.");
Validate.notNull(prismContext, "Prism context must not be null.");
return ObjectQuery.createObjectQuery(createResourceFilter(resourceOid, prismContext));
}

public static ObjectFilter createResourceFilter(String resourceOid, PrismContext prismContext) throws SchemaException {
return RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceOid);
}

Expand Down
Expand Up @@ -44,6 +44,7 @@

import com.evolveum.midpoint.prism.PrismContext;

import com.evolveum.midpoint.prism.query.OrFilter;
import org.apache.commons.lang.StringUtils;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
Expand Down Expand Up @@ -2299,7 +2300,7 @@ public void test159GetAccount() throws Exception {
public void test160SearchNull() throws Exception {
final String TEST_NAME = "test160SearchNull";
TestUtil.displayTestTile(TEST_NAME);
testSeachIterative(TEST_NAME, null, null, true,
testSeachIterative(TEST_NAME, null, null, true, true, false,
"meathook", "daemon", "morgan", "Will");
}

Expand Down Expand Up @@ -2398,7 +2399,19 @@ public void test168aSearchIcfNameExactNoFetch() throws Exception {
ACCOUNT_WILL_USERNAME);
}

protected <T> void testSeachIterativeSingleAttrFilter(final String TEST_NAME, String attrName, T attrVal,
// TEMPORARY todo move to more appropriate place (model-intest?)
@Test
public void test168bSearchIcfNameAndUidExactNoFetch() throws Exception {
final String TEST_NAME = "test168bSearchIcfNameAndUidExactNoFetch";
TestUtil.displayTestTile(TEST_NAME);
testSeachIterativeAlternativeAttrFilter(TEST_NAME, ConnectorFactoryIcfImpl.ICFS_NAME, ACCOUNT_WILL_USERNAME,
ConnectorFactoryIcfImpl.ICFS_UID, willIcfUid,
GetOperationOptions.createNoFetch(), false,
ACCOUNT_WILL_USERNAME);
}


protected <T> void testSeachIterativeSingleAttrFilter(final String TEST_NAME, String attrName, T attrVal,
GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountIds) throws Exception {
testSeachIterativeSingleAttrFilter(TEST_NAME, dummyResourceCtl.getAttributeQName(attrName), attrVal,
rootOptions, fullShadow, expectedAccountIds);
Expand All @@ -2415,22 +2428,52 @@ protected <T> void testSeachIterativeSingleAttrFilter(final String TEST_NAME, QN
ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition(attrQName);
ObjectFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attrPVal);

testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, expectedAccountNames);
}

private void testSeachIterative(final String TEST_NAME, ObjectFilter attrFilter, GetOperationOptions rootOptions,
final boolean fullShadow, String... expectedAccountNames) throws Exception {
testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, true, false, expectedAccountNames);
}

protected <T> void testSeachIterativeAlternativeAttrFilter(final String TEST_NAME, QName attr1QName, T attr1Val,
QName attr2QName, T attr2Val,
GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception {
PrismPropertyValue<T> attr1PVal = null;
if (attr1Val != null) {
attr1PVal = new PrismPropertyValue<T>(attr1Val);
}
PrismPropertyValue<T> attr2PVal = null;
if (attr2Val != null) {
attr2PVal = new PrismPropertyValue<T>(attr2Val);
}
ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext);
ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME);
ResourceAttributeDefinition attr1Def = objectClassDef.findAttributeDefinition(attr1QName);
ObjectFilter filter1 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr1Def.getName()), attr1Def, attr1PVal);
ResourceAttributeDefinition attr2Def = objectClassDef.findAttributeDefinition(attr2QName);
ObjectFilter filter2 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr2Def.getName()), attr2Def, attr2PVal);

testSeachIterative(TEST_NAME, OrFilter.createOr(filter1, filter2), rootOptions, fullShadow, false, true, expectedAccountNames);
}


private void testSeachIterative(final String TEST_NAME, ObjectFilter attrFilter, GetOperationOptions rootOptions,
final boolean fullShadow, boolean useObjectClassFilter, final boolean useRepo, String... expectedAccountNames) throws Exception {
OperationResult result = new OperationResult(TestDummy.class.getName()
+ "." + TEST_NAME);

ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(RESOURCE_DUMMY_OID, new QName(ResourceTypeUtil.getResourceNamespace(resourceType),
ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME), prismContext);

if (attrFilter != null) {
AndFilter filter = (AndFilter) query.getFilter();
filter.getConditions().add(attrFilter);
}
ObjectQuery query;
if (useObjectClassFilter) {
query = ObjectQueryUtil.createResourceAndAccountQuery(RESOURCE_DUMMY_OID, new QName(ResourceTypeUtil.getResourceNamespace(resourceType),
ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME), prismContext);
if (attrFilter != null) {
AndFilter filter = (AndFilter) query.getFilter();
filter.getConditions().add(attrFilter);
}
} else {
query = ObjectQueryUtil.createResourceQuery(RESOURCE_DUMMY_OID, prismContext);
if (attrFilter != null) {
query.setFilter(AndFilter.createAnd(query.getFilter(), attrFilter));
}
}


display("Query", query);

final List<PrismObject<ShadowType>> foundObjects = new ArrayList<PrismObject<ShadowType>>();
Expand All @@ -2442,16 +2485,22 @@ public boolean handle(PrismObject<ShadowType> object, OperationResult parentResu

ObjectType objectType = object.asObjectable();
assertTrue(objectType instanceof ShadowType);
ShadowType shadow = (ShadowType) objectType;
checkAccountShadow(shadow, parentResult, fullShadow);
if (!useRepo) {
ShadowType shadow = (ShadowType) objectType;
checkAccountShadow(shadow, parentResult, fullShadow);
}
return true;
}
};

Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(rootOptions);

// WHEN
provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result);
if (useRepo) {
repositoryService.searchObjectsIterative(ShadowType.class, query, handler, null, result);
} else {
provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result);
}

// THEN
result.computeStatus();
Expand All @@ -2474,9 +2523,10 @@ public boolean handle(PrismObject<ShadowType> object, OperationResult parentResu
}

assertEquals("Wrong number of found objects ("+foundObjects+"): "+foundObjects, expectedAccountNames.length, foundObjects.size());
checkConsistency(foundObjects);

assertSteadyResource();
if (!useRepo) {
checkConsistency(foundObjects);
}
assertSteadyResource();
}

@Test
Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand All @@ -35,12 +36,17 @@
import com.evolveum.midpoint.repo.sql.data.common.type.RAssignmentExtensionType;
import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType;
import com.evolveum.midpoint.repo.sql.data.common.type.RParentOrgRef;
import com.evolveum.midpoint.repo.sql.query.QueryEngine;
import com.evolveum.midpoint.repo.sql.query.QueryException;
import com.evolveum.midpoint.repo.sql.query.RQuery;
import com.evolveum.midpoint.repo.sql.query.RQueryCriteriaImpl;
import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType;
import com.evolveum.midpoint.repo.sql.util.HibernateToSqlTranslator;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -1563,4 +1569,47 @@ public void test420QueryGenericString() throws Exception {
close(session);
}
}

// @Test
// public void atest100() throws Exception {
// Session session = open();
//
// try {
// String expected = null;//HibernateToSqlTranslator.toSql(main);
//
// List<EqualFilter> secondaryEquals = new ArrayList<>();
// EqualFilter eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID),
// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_UID, DOMUtil.XSD_STRING, prismContext),
// "8daaeeae-f0c7-41c9-b258-2a3351aa8876");
// secondaryEquals.add(eq);
// eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME),
// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_NAME, DOMUtil.XSD_STRING, prismContext),
// "some-name");
// secondaryEquals.add(eq);
//
// OrFilter secondaryIdentifierFilter = OrFilter.createOr((List) secondaryEquals);
// RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class,
// prismContext, "ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2");
//
// AndFilter filter = AndFilter.createAnd(ref, secondaryIdentifierFilter);
// ObjectQuery query = ObjectQuery.createObjectQuery(filter);
// LOGGER.debug("Query\n{}", query);
//
// QueryEngine engine = new QueryEngine(repositoryService.getConfiguration(), prismContext);
// RQuery rQuery = engine.interpret(query, ShadowType.class, null, false, session);
// RQueryCriteriaImpl rci = (RQueryCriteriaImpl) rQuery;
// System.out.println(rci);
// System.out.println(rci.getCriteria());
// //just test if DB will handle it or throws some exception
// List l = rQuery.list();
// LOGGER.info(">>>>>>>>asdfasdfasdfasdf{}",l.size());
//
// String real = getInterpretedQuery(session, ShadowType.class, query);
//
// LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real});
// AssertJUnit.assertEquals(expected, real);
// } finally {
// close(session);
// }
// }
}
Expand Up @@ -3,6 +3,8 @@
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration;
import com.evolveum.midpoint.repo.sql.query.custom.CustomQuery;
import com.evolveum.midpoint.repo.sql.query.custom.ShadowQueryWithDisjunction;
import com.evolveum.midpoint.repo.sql.util.GetObjectResult;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
Expand All @@ -24,6 +26,7 @@ public class QueryEngine {
private static final List<CustomQuery> queryLibrary = new ArrayList<>();

static {
queryLibrary.add(new ShadowQueryWithDisjunction());
// queryLibrary.add(new OrgFilterQuery());
}

Expand Down
Expand Up @@ -14,11 +14,12 @@
* limitations under the License.
*/

package com.evolveum.midpoint.repo.sql.query;
package com.evolveum.midpoint.repo.sql.query.custom;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration;
import com.evolveum.midpoint.repo.sql.query.RQuery;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
Expand Down
Expand Up @@ -14,10 +14,12 @@
* limitations under the License.
*/

package com.evolveum.midpoint.repo.sql.query;
package com.evolveum.midpoint.repo.sql.query.custom;

import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.repo.sql.query.RQuery;
import com.evolveum.midpoint.repo.sql.query.RQueryImpl;
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.repo.sql.util.GetObjectResult;
import com.evolveum.midpoint.schema.GetOperationOptions;
Expand All @@ -26,14 +28,15 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.commons.lang.ObjectUtils;
import org.hibernate.Query;
import org.hibernate.Session;

import java.util.Collection;

/**
* @author lazyman
*
* CURRENTLY UNUSED.
*/
public class OrgFilterQuery extends CustomQuery {

Expand Down

0 comments on commit cc4b4f6

Please sign in to comment.