Skip to content

Commit

Permalink
Implementing #any for relation in reference. (MID-2225)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Feb 19, 2015
1 parent 029ec96 commit 45ef547
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 7 deletions.
Expand Up @@ -84,6 +84,7 @@ public class PrismConstants {
public static final QName Q_RELATION = new QName(NS_QUERY, "relation");
public static final QName Q_VALUE = new QName(NS_QUERY, "value");
public static final QName Q_ORDER_BY = new QName(NS_QUERY, "orderBy");
public static final QName Q_ANY = new QName(NS_QUERY, "any");


// Misc
Expand Down
Expand Up @@ -786,6 +786,30 @@ private static <O extends Objectable> PrismObject<O> elementToPrism(Object eleme
}
}

public static void assertOids(Collection<? extends PrismObject<?>> objects, String... expectedOids) {
if ((objects == null || objects.isEmpty()) && expectedOids.length == 0) {
return;
}
if (objects == null) {
fail("Expected OIDs "+Arrays.toString(expectedOids)+", but got no object");
}
if (objects.size() != expectedOids.length) {
fail("Expected OIDs "+Arrays.toString(expectedOids)+", but got "+objects);
}
for (String expectedOid: expectedOids) {
boolean found = false;
for (PrismObject<?> object: objects) {
if (expectedOid.equals(object.getOid())) {
found = true;
break;
}
}
if (!found) {
fail("Expected OIDs "+Arrays.toString(expectedOids)+", but got "+objects);
}
}
}

// XNode asserts

public static void assertSize(MapXNode xmap, int expectedSize) {
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2013 Evolveum
* Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -17,16 +17,21 @@
package com.evolveum.midpoint.repo.sql;

import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.repo.sql.data.common.ROrgClosure;
import com.evolveum.midpoint.schema.DeltaConvertor;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
Expand All @@ -36,6 +41,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
Expand Down Expand Up @@ -590,7 +596,9 @@ public void test009modifyOrgStructRemoveUser() throws Exception {

@Test
public void test011OrgFilter() throws Exception {
OperationResult opResult = new OperationResult("test011OrgFilter");
final String TEST_NAME = "test011OrgFilter";
TestUtil.displayTestTile(TEST_NAME);
OperationResult opResult = new OperationResult(TEST_NAME);

ObjectQuery query = new ObjectQuery();
PrismReferenceValue baseOrgRef = new PrismReferenceValue(ORG_F001_OID);
Expand All @@ -600,8 +608,70 @@ public void test011OrgFilter() throws Exception {
query.setFilter(filter);
query.setPaging(paging);

// WHEN
List<PrismObject<ObjectType>> orgClosure = repositoryService.searchObjects(ObjectType.class, query, null, opResult);

// THEN
AssertJUnit.assertEquals(4, orgClosure.size());
}

@Test
public void test100ParentOrgRefFilterNullRelation() throws Exception {
final String TEST_NAME = "test100ParentOrgRefFilterNullRelation";
TestUtil.displayTestTile(TEST_NAME);
OperationResult opResult = new OperationResult(TEST_NAME);

ObjectQuery query = new ObjectQuery();
PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID);
ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF),
UserType.class, prismContext, refVal);
query.setFilter(filter);

// WHEN
List<PrismObject<ObjectType>> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult);

// THEN
PrismAsserts.assertOids(orgs, ORG_F002_OID, ORG_F003_OID, ORG_F004_OID, ELAINE_OID);
}

@Test
public void test101ParentOrgRefFilterManagerRelation() throws Exception {
final String TEST_NAME = "test101ParentOrgRefFilterManagerRelation";
TestUtil.displayTestTile(TEST_NAME);
OperationResult opResult = new OperationResult(TEST_NAME);

ObjectQuery query = new ObjectQuery();
PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID);
refVal.setRelation(SchemaConstants.ORG_MANAGER);
ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF),
UserType.class, prismContext, refVal);
query.setFilter(filter);

// WHEN
List<PrismObject<ObjectType>> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult);

// THEN
PrismAsserts.assertOids(orgs, ELAINE_OID);
}

@Test
public void test102ParentOrgRefFilterAnyRelation() throws Exception {
final String TEST_NAME = "test102ParentOrgRefFilterAnyRelation";
TestUtil.displayTestTile(TEST_NAME);
OperationResult opResult = new OperationResult(TEST_NAME);

ObjectQuery query = new ObjectQuery();
PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID);
refVal.setRelation(PrismConstants.Q_ANY);
ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF),
UserType.class, prismContext, refVal);
query.setFilter(filter);

// WHEN
List<PrismObject<ObjectType>> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult);

// THEN
PrismAsserts.assertOids(orgs, ORG_F002_OID, ORG_F003_OID, ORG_F004_OID, ELAINE_OID, ELAINE_OID);
}

}
Expand Up @@ -53,6 +53,7 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
Expand All @@ -69,6 +70,7 @@

import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
Expand Down Expand Up @@ -342,6 +344,7 @@ public void queryOrComposite() throws Exception {
//or
Conjunction c4 = Restrictions.conjunction();
c4.add(Restrictions.eq("r.resourceRef.targetOid", "d0db5be9-cb93-401f-b6c1-86ffffe4cd5e"));
c4.add(Restrictions.eq("r.resourceRef.relation", "#"));
c4.add(Restrictions.eq("r.resourceRef.type", QNameUtil.qNameToUri(ResourceType.COMPLEX_TYPE)));

Disjunction disjunction = Restrictions.disjunction();
Expand Down Expand Up @@ -497,6 +500,7 @@ public void queryAccountByAttributesAndResourceRef() throws Exception {
//and
Conjunction c1 = Restrictions.conjunction();
c1.add(Restrictions.eq("r.resourceRef.targetOid", "aae7be60-df56-11df-8608-0002a5d5c51b"));
c1.add(Restrictions.eq("r.resourceRef.relation", "#"));
c1.add(Restrictions.eq("r.resourceRef.type", QNameUtil.qNameToUri(ResourceType.COMPLEX_TYPE)));
//and
Conjunction c2 = Restrictions.conjunction();
Expand Down Expand Up @@ -533,7 +537,10 @@ public void queryUserAccountRef() throws Exception {
main.setProjection(projections);

Criteria refs = main.createCriteria("linkRef", "l", JoinType.LEFT_OUTER_JOIN);
refs.add(Restrictions.conjunction().add(Restrictions.eq("l.targetOid", "123")));
Conjunction c = Restrictions.conjunction();
c.add(Restrictions.eq("l.targetOid", "123"));
c.add(Restrictions.eq("l.relation", "#"));
refs.add(c);

String expected = HibernateToSqlTranslator.toSql(main);

Expand Down Expand Up @@ -561,6 +568,7 @@ public void queryUserAssignmentTargetRef() throws Exception {
c0.add(Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS));
Conjunction c1 = Restrictions.conjunction();
c1.add(Restrictions.eq("a.targetRef.targetOid", "123"));
c1.add(Restrictions.eq("a.targetRef.relation", "#"));
c1.add(Restrictions.eq("a.targetRef.type", RObjectType.ROLE));
c0.add(c1);
a.add(c0);
Expand Down Expand Up @@ -1490,7 +1498,7 @@ public void test390queryObjectypeByTypeAndReference() throws Exception {
c.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER));

Criteria refs = main.createCriteria("linkRef", "l", JoinType.LEFT_OUTER_JOIN);
c.add(Restrictions.and(Restrictions.eq("l.targetOid", "123")));
c.add(Restrictions.and(Restrictions.eq("l.targetOid", "123"),Restrictions.eq("l.relation", "#")));

String expected = HibernateToSqlTranslator.toSql(main);

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

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

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand All @@ -33,12 +34,14 @@
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.commons.lang.StringUtils;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import javax.xml.namespace.QName;

import java.util.List;

/**
Expand Down Expand Up @@ -105,9 +108,14 @@ public Criterion interpretInternal(RefFilter filter) throws QueryException {
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(handleEqOrNull(prefix + ObjectReference.F_TARGET_OID, refValue.getOid()));

if (refValue.getRelation() != null) {
QName relation = refValue.getRelation();

QName relation = refValue.getRelation();
if (relation == null) {
// Return only references without relation
conjunction.add(Restrictions.eq(prefix + ObjectReference.F_RELATION, RUtil.QNAME_DELIMITER));
} else if (relation.equals(PrismConstants.Q_ANY)) {
// Return all relations => no restriction
} else {
// return references with specific relation
conjunction.add(handleEqOrNull(prefix + ObjectReference.F_RELATION, RUtil.qnameToString(relation)));
}

Expand Down

0 comments on commit 45ef547

Please sign in to comment.