Skip to content

Commit

Permalink
fixed query test for org. structure, just for now. also impl on match…
Browse files Browse the repository at this point in the history
…Object started, not finished yet.
  • Loading branch information
1azyman committed Apr 14, 2014
1 parent 8d35e29 commit d3f7094
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 91 deletions.
Expand Up @@ -961,40 +961,32 @@ public void inOidTest() throws Exception {
}
}

@Test(enabled=false) //TODO ENABLE [lazyman]
@Test
public void queryOrgTreeFindOrgs() throws Exception {
Session session = open();

try {
ProjectionList list = Projections.projectionList();
addFullObjectProjectionList("o", list, false);
addFullObjectProjectionList("o", list, true);
list.add(Projections.groupProperty("o.name.orig"));
list.add(Projections.groupProperty("closure.descendant"));
Query query = session.createQuery(
"select o.fullObject,o.stringsCount,o.longsCount,o.datesCount,o.referencesCount,o.polysCount "
+ "from ROrg as o left join o.descendants as d "
+ "where d.ancestorOid=:aOid and d.depth <=:maxDepth "
+ "group by o.fullObject,o.stringsCount,o.longsCount,o.datesCount,o.referencesCount,o.polysCount, o.name.orig "
+ "order by o.name.orig asc");
query.setString("aOid", "1234");
query.setInteger("maxDepth", 1);

Criteria main = session.createCriteria(ROrg.class, "o");
main.createCriteria("descendants", "closure").setFetchMode("closure.ancestor", FetchMode.DEFAULT)
.createAlias("closure.ancestor", "anc").setProjection(list);
main.addOrder(Order.asc("o.name.orig"));

Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.eq("anc.oid", "some oid"));
conjunction.add(Restrictions.le("closure.depth", 1));
conjunction.add(Restrictions.gt("closure.depth", 0));
main.add(conjunction);

String expected = HibernateToSqlTranslator.toSql(main);
String expected = HibernateToSqlTranslator.toSql(factory, query.getQueryString());

OrgFilter orgFilter = OrgFilter.createOrg("some oid", null, 1);
ObjectQuery query = ObjectQuery.createObjectQuery(orgFilter);
query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING));
ObjectQuery objectQuery = ObjectQuery.createObjectQuery(orgFilter);
objectQuery.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING));

String real = getInterpretedQuery(session, OrgType.class, query);
String real = getInterpretedQuery(session, OrgType.class, objectQuery);

LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real});

OperationResult result = new OperationResult("query org structure");
repositoryService.searchObjects(OrgType.class, query, null, result);
repositoryService.searchObjects(OrgType.class, objectQuery, null, result);

AssertJUnit.assertEquals(expected, real);
} finally {
Expand Down Expand Up @@ -1110,26 +1102,4 @@ public void test200ActivationQuery() throws Exception {
close(session);
}
}

// @Test
// public void test300() throws Exception {
// Session session = open();
// try {
// Query query = session.createQuery(
// "select o.fullObject,o.stringsCount,o.longsCount,o.datesCount,o.referencesCount,o.polysCount from "
// + ClassMapper.getHQLType(UserType.class) + " as o left join o.descendants as d "
// + "where d.ancestorOid=:aOid and d.depth <=:maxDepth and d.depth>:minDepth "
// + "group by o.fullObject,o.stringsCount,o.longsCount,o.datesCount,o.referencesCount,o.polysCount, o.name.orig "
// + "order by o.name.orig asc");
// query.setString("aOid", "1234");
// query.setInteger("minDepth", 1);
// query.setInteger("maxDepth", 1);
//
// LOGGER.info("vilko {}", HibernateToSqlTranslator.toSql(factory, query.getQueryString()));
//
// query.list();
// } finally {
// close(session);
// }
// }
}
Expand Up @@ -28,6 +28,7 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.repo.api.RepoAddOptions;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.sql.data.common.*;
Expand Down Expand Up @@ -402,7 +403,14 @@ public <T extends ObjectType> String addObject(PrismObject<T> object, RepoAddOpt
validateName(object);
Validate.notNull(result, "Operation result must not be null.");

LOGGER.debug("Adding object type '{}'", new Object[]{object.getCompileTimeClass().getSimpleName()});
if (options == null) {
options = new RepoAddOptions();
}

LOGGER.debug("Adding object type '{}', overwrite={}, allowUnencryptedValues={}",
new Object[]{object.getCompileTimeClass().getSimpleName(), options.isOverwrite(),
options.isAllowUnencryptedValues()}
);

if (InternalsConfig.encryptionChecks && !RepoAddOptions.isAllowUnencryptedValues(options)) {
CryptoUtil.checkEncrypted(object);
Expand All @@ -418,10 +426,6 @@ public <T extends ObjectType> String addObject(PrismObject<T> object, RepoAddOpt
LOGGER.trace("NAME: {} - {}", namePolyType.getOrig(), namePolyType.getNorm());
}

if (options == null) {
options = new RepoAddOptions();
}

OperationResult subResult = result.createSubresult(ADD_OBJECT);
subResult.addParam("object", object);
subResult.addParam("options", options);
Expand Down Expand Up @@ -954,7 +958,8 @@ private <T extends ObjectType> void logSearchInputParameters(Class<T> type, Obje
ObjectPaging paging = query != null ? query.getPaging() : null;
LOGGER.debug("Searching objects of type '{}', query (on trace level), offset {}, count {}, iterative {}.",
new Object[]{type.getSimpleName(), (paging != null ? paging.getOffset() : "undefined"),
(paging != null ? paging.getMaxSize() : "undefined"), iterative});
(paging != null ? paging.getMaxSize() : "undefined"), iterative}
);

if (!LOGGER.isTraceEnabled()) {
return;
Expand Down Expand Up @@ -1251,7 +1256,8 @@ private <T extends ObjectType> void recomputeHierarchy(
if (!(orgRefDValue instanceof PrismReferenceValue)) {
throw new SchemaException(
"Couldn't modify organization structure hierarchy (adding new records). Expected " +
"instance of prism reference value but got " + orgRefDValue);
"instance of prism reference value but got " + orgRefDValue
);
}

PrismReferenceValue value = (PrismReferenceValue) orgRefDValue;
Expand Down Expand Up @@ -1809,7 +1815,40 @@ protected int cleanupAttempt(Class entity, Date minValue, Session session) {

@Override
public <T extends ObjectType> boolean matchObject(PrismObject<T> object, ObjectQuery query) throws SchemaException {
Validate.notNull(object, "Object must not be null.");
Validate.notNull(query, "Query must not be null.");

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Matching object\n{} with query\n{}", new Object[]{object, query});
}

boolean applicable = ObjectQuery.match(object, query.getFilter(), getMatchingRuleRegistry());
return applicable;
OrgFilter orgFilter = RUtil.findOrgFilter(query);
if (orgFilter == null) {
return applicable;
}

final String operation = "matching";
int attempt = 1;

SqlPerformanceMonitor pm = getPerformanceMonitor();
long opHandle = pm.registerOperationStart("matchObject");

try {
while (true) {
try {
matchObject(object, orgFilter);
} catch (RuntimeException ex) {
attempt = logOperationAttempt(object.getOid(), operation, attempt, ex, null);
pm.registerOperationNewTrial(opHandle, attempt);
}
}
} finally {
pm.registerOperationFinish(opHandle, attempt);
}
}

private <T extends ObjectType> boolean matchObject(PrismObject<T> object, OrgFilter filter) throws SchemaException {
return false;
}
}
Expand Up @@ -17,9 +17,11 @@
package com.evolveum.midpoint.repo.sql.query;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration;
import com.evolveum.midpoint.repo.sql.query.definition.Definition;
import com.evolveum.midpoint.repo.sql.query.definition.EntityDefinition;
Expand All @@ -31,8 +33,6 @@
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ObjectSelector;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.util.ClassPathUtil;
import com.evolveum.midpoint.util.exception.SystemException;
Expand All @@ -43,9 +43,11 @@
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.reflect.ConstructorUtils;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.criterion.*;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;

import java.lang.reflect.Modifier;
import java.util.*;
Expand Down Expand Up @@ -155,28 +157,9 @@ public Criteria interpret(ObjectQuery query, Class<? extends ObjectType> type,
}

private boolean usesOrgFilter(ObjectQuery query) {
return query != null && usesOrgFilter(query.getFilter());
}

private boolean usesOrgFilter(ObjectFilter query) {
if (query == null) {
return false;
}

if (query instanceof OrgFilter) {
OrgFilter f = (OrgFilter)query;
if (!f.isRoot()) {
return true;
}
}

if (query instanceof LogicalFilter) {
LogicalFilter l = (LogicalFilter) query;
for (ObjectFilter f : l.getCondition()) {
if (usesOrgFilter(f)) {
return true;
}
}
OrgFilter filter = RUtil.findOrgFilter(query);
if (filter != null && !filter.isRoot()) {
return true;
}

return false;
Expand Down Expand Up @@ -240,18 +223,18 @@ public <T extends ObjectType> Criteria updatePagingAndSorting(Criteria query, Cl
}

if (paging.getDirection() != null) {
switch (paging.getDirection()) {
case ASCENDING:
query = query.addOrder(Order.asc(propertyName));
break;
case DESCENDING:
query = query.addOrder(Order.desc(propertyName));
break;
}
} else {
query = query.addOrder(Order.asc(propertyName));
switch (paging.getDirection()) {
case ASCENDING:
query = query.addOrder(Order.asc(propertyName));
break;
case DESCENDING:
query = query.addOrder(Order.desc(propertyName));
break;
}
} else {
query = query.addOrder(Order.asc(propertyName));
}


return query;
}
Expand Down
Expand Up @@ -26,6 +26,10 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.LogicalFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.prism.util.ValueSerializationUtil;
import com.evolveum.midpoint.repo.sql.data.audit.RObjectDeltaOperation;
Expand Down Expand Up @@ -821,4 +825,31 @@ public static String getXmlFromByteArray(byte[] array, boolean compressed) {

return xml;
}

public static OrgFilter findOrgFilter(ObjectQuery query) {
return query != null ? findOrgFilter(query.getFilter()) : null;
}

public static OrgFilter findOrgFilter(ObjectFilter filter) {
if (filter == null) {
return null;
}

if (filter instanceof OrgFilter) {
return (OrgFilter) filter;
}

if (filter instanceof LogicalFilter) {
LogicalFilter logical = (LogicalFilter) filter;
for (ObjectFilter f : logical.getCondition()) {
OrgFilter o = findOrgFilter(f);
if (o != null) {
return o;
}
}
}

return null;
}

}

0 comments on commit d3f7094

Please sign in to comment.