From e1262a93506ca0573ab722f5ef04f5b694c1f8c2 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 11 Mar 2020 18:49:13 +0100 Subject: [PATCH] Adapt repo tests after schema cleanup (MID-5693) These tests dealt with obsolete items, typically role.ownerRef. --- .../midpoint/prism/query/QueryConverter.java | 10 +- .../impl/marshaller/QueryConverterImpl.java | 171 ++++++++---------- .../repo/sql/QueryInterpreter2Test.java | 102 +++++------ .../midpoint/repo/sql/SearchTest.java | 28 +-- 4 files changed, 141 insertions(+), 170 deletions(-) diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/query/QueryConverter.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/query/QueryConverter.java index 48a6438f351..f7e1d42562b 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/query/QueryConverter.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/query/QueryConverter.java @@ -34,16 +34,14 @@ public interface QueryConverter { * Tries to parse as much from filter as possible, without knowing the definition of object(s) to which the * filter will be applied. It is used mainly to parse path specifications, in order to avoid namespace loss * when serializing raw (unparsed) paths and QNames - see MID-1969. - * @param xfilter - * @param pc */ void parseFilterPreliminarily(MapXNode xfilter, ParsingContext pc) throws SchemaException; // 1b. Parsing queries - ObjectQuery createObjectQuery(Class clazz, QueryType queryType) throws SchemaException; + ObjectQuery createObjectQuery(Class clazz, QueryType queryType) throws SchemaException; - ObjectQuery createObjectQuery(Class clazz, SearchFilterType filterType) throws SchemaException; + ObjectQuery createObjectQuery(Class clazz, SearchFilterType filterType) throws SchemaException; // 2. Serializing @@ -51,10 +49,10 @@ public interface QueryConverter { SearchFilterType createSearchFilterType(ObjectFilter filter) throws SchemaException; - ObjectFilter createObjectFilter(Class clazz, SearchFilterType filterType) + ObjectFilter createObjectFilter(Class clazz, SearchFilterType filterType) throws SchemaException; - ObjectFilter createObjectFilter(PrismObjectDefinition objectDefinition, SearchFilterType filterType) + ObjectFilter createObjectFilter(PrismContainerDefinition containerDefinition, SearchFilterType filterType) throws SchemaException; MapXNode serializeFilter(ObjectFilter filter) throws SchemaException; diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/marshaller/QueryConverterImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/marshaller/QueryConverterImpl.java index c4efd012d74..7a1668fc453 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/marshaller/QueryConverterImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/marshaller/QueryConverterImpl.java @@ -196,42 +196,42 @@ private ObjectFilter parseFilterInternal(XNodeImpl cla private AndFilter parseAndFilter(MapXNodeImpl clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, ParsingContext pc) throws SchemaException { - List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, pc); + List subFilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, pc); if (preliminaryParsingOnly) { return null; } else { - return prismContext.queryFactory().createAnd(subfilters); + return prismContext.queryFactory().createAnd(subFilters); } } private List parseLogicalFilter(MapXNodeImpl clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, ParsingContext pc) throws SchemaException { - List subfilters = new ArrayList<>(); + List subFilters = new ArrayList<>(); for (Entry entry : clauseXMap.entrySet()) { if (entry.getValue() instanceof ListXNodeImpl){ for (XNodeImpl xNode : ((ListXNodeImpl) entry.getValue())) { ObjectFilter subFilter = parseFilterInternal(xNode, entry.getKey(), pcd, preliminaryParsingOnly, pc); if (!preliminaryParsingOnly) { - subfilters.add(subFilter); + subFilters.add(subFilter); } } } else{ ObjectFilter subfilter = parseFilterInternal(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, pc); if (!preliminaryParsingOnly) { - subfilters.add(subfilter); + subFilters.add(subfilter); } } } - return subfilters; + return subFilters; } private OrFilter parseOrFilter(MapXNodeImpl clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, ParsingContext pc) throws SchemaException { - List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, pc); + List subFilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, pc); if (preliminaryParsingOnly) { return null; } else { - return OrFilterImpl.createOr(subfilters); + return OrFilterImpl.createOr(subFilters); } } @@ -267,7 +267,7 @@ private ObjectFilter parseComparisonFilter(QName cla XNodeImpl valueXnode = clauseXMap.get(ELEMENT_VALUE); ItemPath rightSidePath = getPath(clauseXMap, ELEMENT_RIGHT_HAND_SIDE_PATH); - ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd); + ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd); if (itemDefinition != null) { itemName = itemDefinition.getItemName(); } @@ -277,6 +277,7 @@ private ObjectFilter parseComparisonFilter(QName cla return null; } else { RootXNodeImpl valueRoot = new RootXNodeImpl(ELEMENT_VALUE, valueXnode); + //noinspection rawtypes Item item = parseItem(valueRoot, itemName, itemDefinition); if (!isEq && item.getValues().size() != 1) { throw new SchemaException("Expected exactly one value, got " + item.getValues().size() + " instead"); @@ -286,9 +287,9 @@ private ObjectFilter parseComparisonFilter(QName cla List> values = item.getValues(); PrismValueCollectionsUtil.clearParent(values); //noinspection unchecked - return prismContext.queryFactory().createEqual(itemPath, (PrismPropertyDefinition)itemDefinition, matchingRule, prismContext, values); + return EqualFilterImpl.createEqual(itemPath, (PrismPropertyDefinition)itemDefinition, matchingRule, prismContext, values); } else if (isSubstring) { - return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, item.getAnyValue(), getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); + return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, item.getAnyValue(), getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); } //noinspection unchecked PrismPropertyValue propertyValue = (PrismPropertyValue) item.getAnyValue(); @@ -306,16 +307,13 @@ private ObjectFilter parseComparisonFilter(QName cla if (preliminaryParsingOnly) { return null; } else { - ItemDefinition rightSideDefinition = pcd != null ? pcd.findItemDefinition(rightSidePath) : null; + ItemDefinition rightSideDefinition = pcd != null ? pcd.findItemDefinition(rightSidePath) : null; if (isEq) { - //noinspection unchecked - return prismContext.queryFactory().createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition); + return EqualFilterImpl.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition); } else if (isGt || isGtEq) { - //noinspection unchecked - return GreaterFilterImpl.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition, isGtEq); + return GreaterFilterImpl.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition, isGtEq); } else { - //noinspection unchecked - return LessFilterImpl.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition, isLtEq); + return LessFilterImpl.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition, isLtEq); } } } else { @@ -326,13 +324,13 @@ private ObjectFilter parseComparisonFilter(QName cla return null; } else { RootXNodeImpl expressionRoot = clauseXMap.getEntryAsRoot(expressionEntry.getKey()); - PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); + PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); ExpressionWrapper expressionWrapper = new ExpressionWrapper(expressionEntry.getKey(), expressionPropertyValue.getValue()); if (isEq) { //noinspection unchecked - return prismContext.queryFactory().createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); - } else if (isSubstring){ - return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, expressionWrapper, getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); + return EqualFilterImpl.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); + } else if (isSubstring) { + return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, expressionWrapper, getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); } else if (isGt || isGtEq) { //noinspection unchecked return GreaterFilterImpl.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper, isGtEq); @@ -349,12 +347,12 @@ private ObjectFilter parseComparisonFilter(QName cla return null; } else { - if (isSubstring){ - return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, null, getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); + if (isSubstring) { + return SubstringFilterImpl.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, matchingRule, null, getAnchorStart(clauseXMap), getAnchorEnd(clauseXMap)); + } else { + //noinspection unchecked + return EqualFilterImpl.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); } - - //noinspection unchecked - return prismContext.queryFactory().createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); } } } @@ -417,11 +415,12 @@ private TypeFilter parseTypeFilter(MapXNodeImpl clauseXMap, boolean preliminaryP ParsingContext pc) throws SchemaException{ QName type = clauseXMap.getParsedPrimitiveValue(ELEMENT_TYPE, DOMUtil.XSD_QNAME); XNodeImpl subXFilter = clauseXMap.get(ELEMENT_FILTER); - PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(type); - ObjectFilter subFilter = null; + PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(type); + ObjectFilter subFilter; if (subXFilter instanceof MapXNodeImpl) { - //noinspection unchecked subFilter = parseFilterInternal((MapXNodeImpl) subXFilter, def, preliminaryParsingOnly, pc); + } else { + subFilter = null; } if (!preliminaryParsingOnly || pc == null || pc.isStrict()) { // MID-3614: we want to be strict when importing but forgiving when reading from the repository @@ -434,15 +433,16 @@ private TypeFilter parseTypeFilter(MapXNodeImpl clauseXMap, boolean preliminaryP } } - private ExistsFilter parseExistsFilter(MapXNodeImpl clauseXMap, PrismContainerDefinition pcd, + private ExistsFilter parseExistsFilter(MapXNodeImpl clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, ParsingContext pc) throws SchemaException { ItemPath path = getPath(clauseXMap); XNodeImpl subXFilter = clauseXMap.get(ELEMENT_FILTER); - ObjectFilter subFilter = null; - PrismContainerDefinition subPcd = pcd != null ? pcd.findContainerDefinition(path) : null; + ObjectFilter subFilter; + PrismContainerDefinition subPcd = pcd != null ? pcd.findContainerDefinition(path) : null; if (subXFilter instanceof MapXNodeImpl) { - //noinspection unchecked subFilter = parseFilterInternal((MapXNodeImpl) subXFilter, subPcd, preliminaryParsingOnly, pc); + } else { + subFilter = null; } if (!preliminaryParsingOnly || pc == null || pc.isStrict()) { // MID-3614: we want to be strict when importing but forgiving when reading from the repository @@ -451,7 +451,6 @@ private ExistsFilter parseExistsFilter(MapXNodeImpl clauseXMap, PrismContainerDe if (preliminaryParsingOnly) { return null; } else { - //noinspection unchecked return ExistsFilterImpl.createExists(path, pcd, subFilter); } } @@ -475,7 +474,7 @@ private RefFilter parseRefFilter(MapXNodeImpl clauseXM } QName itemName = ItemPath.toName(itemPath.last()); - ItemDefinition itemDefinition = null; + ItemDefinition itemDefinition = null; if (pcd != null) { itemDefinition = pcd.findItemDefinition(itemPath); if (itemDefinition == null && !preliminaryParsingOnly) { @@ -536,18 +535,12 @@ private ExpressionWrapper parseExpression(MapXNodeImpl xmap) throws SchemaExcept private boolean getAnchorStart(MapXNodeImpl clauseXMap) throws SchemaException { Boolean anchorStart = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_START, DOMUtil.XSD_BOOLEAN); - if (anchorStart == null) { - return false; - } - return anchorStart.booleanValue(); + return anchorStart != null && anchorStart; } private boolean getAnchorEnd(MapXNodeImpl clauseXMap) throws SchemaException { Boolean anchorEnd = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_END, DOMUtil.XSD_BOOLEAN); - if (anchorEnd == null) { - return false; - } - return anchorEnd.booleanValue(); + return anchorEnd != null && anchorEnd; } private OrgFilter parseOrgFilter(MapXNodeImpl clauseXMap, boolean preliminaryParsingOnly) throws SchemaException { @@ -560,17 +553,17 @@ private OrgFilter parseOrgFilter(MapXNodeImpl clauseXMap, boolean preliminaryPar } } - XNodeImpl xorgrefnode = clauseXMap.get(ELEMENT_ORG_REF); - if (xorgrefnode == null) { + XNodeImpl xOrgRefNode = clauseXMap.get(ELEMENT_ORG_REF); + if (xOrgRefNode == null) { throw new SchemaException("No organization reference defined in the search query."); } - MapXNodeImpl xorgrefmap = toMap(xorgrefnode); - String orgOid = xorgrefmap.getParsedPrimitiveValue(ELEMENT_OID, DOMUtil.XSD_STRING); + MapXNodeImpl xOrgRefMap = toMap(xOrgRefNode); + String orgOid = xOrgRefMap.getParsedPrimitiveValue(ELEMENT_OID, DOMUtil.XSD_STRING); if (orgOid == null || StringUtils.isBlank(orgOid)) { throw new SchemaException("No oid attribute defined in the organization reference element."); } - String scopeString = xorgrefmap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // original (in my opinion incorrect) place + String scopeString = xOrgRefMap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // original (in my opinion incorrect) place if (scopeString == null) { scopeString = clauseXMap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // here it is placed by the serializer } @@ -637,7 +630,7 @@ private QName getMatchingRule(MapXNodeImpl xmap) throws SchemaException{ } } - private Item parseItem(RootXNodeImpl root, QName itemName, ItemDefinition itemDefinition) throws SchemaException{ + private Item parseItem(RootXNodeImpl root, QName itemName, ItemDefinition itemDefinition) throws SchemaException { Item item; item = prismContext.parserFor(root) .name(itemName) @@ -652,11 +645,10 @@ private Item parseItem(RootXNodeImpl root, QName itemName, ItemDefinition itemDe return item; } - private ItemDefinition locateItemDefinition(XNodeImpl valueXnode, ItemPath itemPath, + private ItemDefinition locateItemDefinition(XNodeImpl valueXnode, ItemPath itemPath, PrismContainerDefinition pcd) throws SchemaException{ - ItemDefinition itemDefinition = null; if (pcd != null) { - itemDefinition = pcd.findItemDefinition(itemPath); + ItemDefinition itemDefinition = pcd.findItemDefinition(itemPath); if (itemDefinition == null) { ItemPath rest = itemPath.rest(); QName first = itemPath.firstToName(); @@ -664,14 +656,15 @@ private ItemDefinition locateItemDefinition(XNodeImpl if (rest.isEmpty()) { return itemDefinition; } else{ - if (itemDefinition instanceof PrismContainerDefinition){ - //noinspection unchecked - return locateItemDefinition(valueXnode, rest, (PrismContainerDefinition) itemDefinition); + if (itemDefinition instanceof PrismContainerDefinition) { + return locateItemDefinition(valueXnode, rest, (PrismContainerDefinition) itemDefinition); } } } + return itemDefinition; + } else { + return null; } - return itemDefinition; } public MapXNodeImpl serializeFilter(ObjectFilter filter) throws SchemaException{ @@ -692,8 +685,7 @@ private MapXNodeImpl serializeFilter(ObjectFilter filter, PrismSerializer) filter, xnodeSerializer); } else if (filter instanceof RefFilter) { return serializeRefFilter((RefFilter) filter, xnodeSerializer); } else if (filter instanceof OrgFilter) { @@ -723,18 +715,18 @@ private MapXNodeImpl serializeFilter(ObjectFilter filter, PrismSerializer xnodeSerilizer) throws SchemaException{ - return createFilter(CLAUSE_AND, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); + private MapXNodeImpl serializeAndFilter(AndFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ + return createFilter(CLAUSE_AND, serializeNaryLogicalSubFilters(filter.getConditions(), xnodeSerializer)); } - private MapXNodeImpl serializeOrFilter(OrFilter filter, PrismSerializer xnodeSerilizer) throws SchemaException{ - return createFilter(CLAUSE_OR, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); + private MapXNodeImpl serializeOrFilter(OrFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ + return createFilter(CLAUSE_OR, serializeNaryLogicalSubFilters(filter.getConditions(), xnodeSerializer)); } - private MapXNodeImpl serializeNaryLogicalSubfilters(List objectFilters, PrismSerializer xnodeSerilizer) throws SchemaException{ + private MapXNodeImpl serializeNaryLogicalSubFilters(List objectFilters, PrismSerializer xnodeSerializer) throws SchemaException{ MapXNodeImpl filters = new MapXNodeImpl(); for (ObjectFilter of : objectFilters) { - MapXNodeImpl subFilter = serializeFilter(of, xnodeSerilizer); + MapXNodeImpl subFilter = serializeFilter(of, xnodeSerializer); filters.merge(subFilter); } return filters; @@ -796,9 +788,9 @@ private MapXNodeImpl serializeComparisonFilter(PropertyValueFilter filter if (filter instanceof EqualFilter) { clause = CLAUSE_EQUAL; } else if (filter instanceof GreaterFilter) { - clause = ((GreaterFilter) filter).isEquals() ? CLAUSE_GREATER_OR_EQUAL : CLAUSE_GREATER; + clause = ((GreaterFilter) filter).isEquals() ? CLAUSE_GREATER_OR_EQUAL : CLAUSE_GREATER; } else if (filter instanceof LessFilter) { - clause = ((LessFilter) filter).isEquals() ? CLAUSE_LESS_OR_EQUAL : CLAUSE_LESS; + clause = ((LessFilter) filter).isEquals() ? CLAUSE_LESS_OR_EQUAL : CLAUSE_LESS; } else if (filter instanceof SubstringFilter) { clause = CLAUSE_SUBSTRING; } else { @@ -812,7 +804,7 @@ private MapXNodeImpl serializeComparisonFilter(PropertyValueFilter filter return map; } - private MapXNodeImpl serializeValueFilter(ValueFilter filter, PrismSerializer xnodeSerializer) throws SchemaException { + private > MapXNodeImpl serializeValueFilter(ValueFilter filter, PrismSerializer xnodeSerializer) throws SchemaException { MapXNodeImpl map = new MapXNodeImpl(); serializeMatchingRule(filter, map); serializePath(map, filter.getFullPath(), filter); @@ -840,9 +832,9 @@ private MapXNodeImpl serializeV new ItemPathType(filter.getRightHandSidePath()), ItemPathType.COMPLEX_TYPE)); } - ExpressionWrapper xexpression = filter.getExpression(); - if (xexpression != null) { - map.merge(PrismUtilInternal.serializeExpression(xexpression, xnodeSerializer)); + ExpressionWrapper expression = filter.getExpression(); + if (expression != null) { + map.merge(PrismUtilInternal.serializeExpression(expression, xnodeSerializer)); } return map; @@ -850,10 +842,10 @@ private MapXNodeImpl serializeV private void postProcessValueFilter(PropertyValueFilter filter, MapXNodeImpl mapXNode) { if (filter instanceof SubstringFilter) { - if (((SubstringFilter) filter).isAnchorStart()) { + if (((SubstringFilter) filter).isAnchorStart()) { mapXNode.put(ELEMENT_ANCHOR_START, new PrimitiveXNodeImpl<>(true)); } - if (((SubstringFilter) filter).isAnchorEnd()) { + if (((SubstringFilter) filter).isAnchorEnd()) { mapXNode.put(ELEMENT_ANCHOR_END, new PrimitiveXNodeImpl<>(true)); } } @@ -911,7 +903,7 @@ private MapXNodeImpl serializeUndefinedFilter() { return createFilter(CLAUSE_UNDEFINED, new MapXNodeImpl()); } - private void serializeMatchingRule(ValueFilter filter, MapXNodeImpl map) { + private void serializeMatchingRule(ValueFilter filter, MapXNodeImpl map) { if (filter.getMatchingRule() != null){ PrimitiveXNodeImpl matchingNode = createPrimitiveXNode(filter.getMatchingRule().getLocalPart(), DOMUtil.XSD_STRING); map.put(ELEMENT_MATCHING, matchingNode); @@ -948,11 +940,11 @@ private PrimitiveXNodeImpl createPrimitiveXNode(T val, QName type) { * when serializing raw (unparsed) paths and QNames - see MID-1969. */ @Override - public void parseFilterPreliminarily(MapXNode xfilter, ParsingContext pc) throws SchemaException { - parseFilterInternal((MapXNodeImpl) xfilter, null, true, pc); + public void parseFilterPreliminarily(MapXNode xFilter, ParsingContext pc) throws SchemaException { + parseFilterInternal((MapXNodeImpl) xFilter, null, true, pc); } - public ObjectQuery createObjectQuery(Class clazz, QueryType queryType) + public ObjectQuery createObjectQuery(Class clazz, QueryType queryType) throws SchemaException { if (queryType == null) { return null; @@ -960,42 +952,37 @@ public ObjectQuery createObjectQuery(Class clazz, Quer return createObjectQueryInternal(clazz, queryType.getFilter(), queryType.getPaging()); } - public ObjectQuery createObjectQuery(Class clazz, SearchFilterType filterType) + public ObjectQuery createObjectQuery(Class clazz, SearchFilterType filterType) throws SchemaException { return createObjectQueryInternal(clazz, filterType, null); } - public ObjectFilter createObjectFilter(Class clazz, SearchFilterType filterType) + public ObjectFilter createObjectFilter(Class clazz, SearchFilterType filterType) throws SchemaException { ObjectQuery query = createObjectQueryInternal(clazz, filterType, null); - if (query == null) { - return null; - } else { - return query.getFilter(); - } + return query.getFilter(); } - public ObjectFilter createObjectFilter(PrismObjectDefinition objectDefinition, + public ObjectFilter createObjectFilter(PrismContainerDefinition containerDefinition, SearchFilterType filterType) throws SchemaException { - ObjectQuery query = createObjectQueryInternal(objectDefinition, filterType, null); - if (query == null) { - return null; - } else { - return query.getFilter(); - } + ObjectQuery query = createObjectQueryInternal(containerDefinition, filterType, null); + return query.getFilter(); } + @NotNull private ObjectQuery createObjectQueryInternal(Class clazz, SearchFilterType filterType, PagingType pagingType) throws SchemaException { PrismContainerDefinition objDef = prismContext.getSchemaRegistry().findContainerDefinitionByCompileTimeClass(clazz); if (objDef == null) { throw new SchemaException("cannot find obj/container definition for class "+clazz); + } else { + return createObjectQueryInternal(objDef, filterType, pagingType); } - return createObjectQueryInternal(objDef, filterType, pagingType); } + @NotNull private ObjectQuery createObjectQueryInternal(PrismContainerDefinition objDef, SearchFilterType filterType, PagingType pagingType) throws SchemaException { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 8eea57a169a..082f0efa223 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -110,8 +110,9 @@ public void initSystem() throws Exception { List> objects = prismContext.parserFor( new File(FOLDER_BASIC, "objects.xml")).parseObjects(); OperationResult result = new OperationResult("add objects"); - for (PrismObject object : objects) { - repositoryService.addObject(object, null, result); + for (PrismObject object : objects) { + //noinspection unchecked + repositoryService.addObject((PrismObject) object, null, result); } prepareItemDefinitions(); @@ -2165,7 +2166,8 @@ public void test0500OrgQuery() throws Exception { List> orgStruct = prismContext.parserFor(objects).parseObjects(); for (PrismObject o : orgStruct) { - repositoryService.addObject((PrismObject) o, null, opResult); + //noinspection unchecked + repositoryService.addObject((PrismObject) o, null, opResult); } opResult.computeStatusIfUnknown(); assertTrue(opResult.isSuccess()); @@ -2207,16 +2209,15 @@ private void checkQueryResult(Class type, String oid, OperationResult result = new OperationResult("checkQueryResult"); List> objects = repositoryService.searchObjects(type, query, null, result); - for (PrismObject object : objects) { + for (PrismObject object : objects) { logger.info("{}", object.getOid()); } - int realCount = objects.size(); - assertEquals("Expected count doesn't match for searchObjects " + query, count, realCount); + assertEquals("Expected count doesn't match for searchObjects " + query, count, objects.size()); result.computeStatusIfUnknown(); assertTrue(result.isSuccess()); - realCount = repositoryService.countObjects(type, query, null, result); + int realCount = repositoryService.countObjects(type, query, null, result); assertEquals("Expected count doesn't match for countObjects " + query, count, realCount); result.computeStatusIfUnknown(); @@ -2323,8 +2324,10 @@ public void test0540queryObjectClassTypeUser() throws Exception { Session session = open(); try { - TypeFilter type = prismContext.queryFactory().createType(UserType.COMPLEX_TYPE, null); - String real = getInterpretedQuery2(session, ObjectType.class, prismContext.queryFactory().createQuery(type)); + ObjectQuery query = prismContext.queryFor(ObjectType.class) + .type(UserType.class) + .build(); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.oid, o.fullObject\n" + "from\n" + @@ -2343,8 +2346,10 @@ public void test0550queryObjectClassTypeAbstractRole() throws Exception { Session session = open(); try { - TypeFilter type = prismContext.queryFactory().createType(AbstractRoleType.COMPLEX_TYPE, null); - String real = getInterpretedQuery2(session, ObjectType.class, prismContext.queryFactory().createQuery(type)); + ObjectQuery query = prismContext.queryFor(ObjectType.class) + .type(AbstractRoleType.class) + .build(); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.oid, o.fullObject\n" + "from\n" + @@ -2382,7 +2387,7 @@ public void test0560queryMetadataTimestamp() throws Exception { } @Test - public void test0570queryObjectypeByTypeUserAndLocality() throws Exception { + public void test0570QueryObjectTypeByTypeUserAndLocality() throws Exception { Session session = open(); try { ObjectQuery query = prismContext.queryFor(ObjectType.class) @@ -2597,28 +2602,31 @@ public void test0601QueryObjectypeByTwoAbstractTypes() throws Exception { } } - @Test(enabled = false) - public void test0605QueryObjectypeByTypeAndReference() throws Exception { + @Test + public void test0605QueryObjectTypeByTypeAndReference() throws Exception { Session session = open(); try { PrismObjectDefinition roleDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(RoleType.class); ObjectQuery query = prismContext.queryFor(ObjectType.class) .id("c0c010c0-d34d-b33f-f00d-111111111111") .or().type(RoleType.class) - .item(roleDef, RoleType.F_DELEGATED_REF).ref("c0c010c0-d34d-b33f-f00d-111111111111") + .item(roleDef, RoleType.F_ROLE_MEMBERSHIP_REF).ref("c0c010c0-d34d-b33f-f00d-111111111111") .build(); String real = getInterpretedQuery2(session, ObjectType.class, query); - String expected = "select o.oid, o.fullObject\n" + String expected = "select\n" + + " o.oid,\n" + + " o.fullObject\n" + "from\n" + " RObject o\n" + + " left join o.roleMembershipRef r\n" + "where\n" + " (\n" + " o.oid in :oid or\n" + " (\n" + " o.objectTypeClass = :objectTypeClass and\n" + " (\n" - + " o.ownerRef.targetOid = :targetOid and\n" // TODO: change ownerRef -> delegatedRef - + " o.ownerRef.relation in (:relation)\n" + + " r.targetOid = :targetOid and\n" + + " r.relation in (:relation)\n" + " )\n" + " )\n" + " )\n"; @@ -2629,12 +2637,10 @@ public void test0605QueryObjectypeByTypeAndReference() throws Exception { } } - @Test(enabled = false) - public void test0606QueryObjectypeByTypeAndOwnerRefOverloaded() throws Exception { + @Test + public void test0606QueryObjectTypeByTypeAndOwnerRefOverloaded() throws Exception { Session session = open(); try { - PrismObjectDefinition roleDef = - prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(RoleType.class); PrismObjectDefinition campaignDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(AccessCertificationCampaignType.class); PrismObjectDefinition definitionDef = @@ -2644,14 +2650,14 @@ public void test0606QueryObjectypeByTypeAndOwnerRefOverloaded() throws Exception ObjectQuery query = prismContext.queryFor(ObjectType.class) .id("c0c010c0-d34d-b33f-f00d-111111111111") -// .or().type(RoleType.class).item(roleDef, RoleType.F_OWNER_REF).ref("role-owner-oid") .or().type(AccessCertificationCampaignType.class).item(campaignDef, AccessCertificationCampaignType.F_OWNER_REF).ref("campaign-owner-oid") .or().type(AccessCertificationDefinitionType.class).item(definitionDef, AccessCertificationDefinitionType.F_OWNER_REF).ref("definition-owner-oid") .or().type(TaskType.class).item(taskDef, AccessCertificationDefinitionType.F_OWNER_REF).ref("task-owner-oid") .build(); String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" - + " o.oid, o.fullObject\n" + + " o.oid,\n" + + " o.fullObject\n" + "from\n" + " RObject o\n" + "where\n" @@ -2660,29 +2666,22 @@ public void test0606QueryObjectypeByTypeAndOwnerRefOverloaded() throws Exception + " (\n" + " o.objectTypeClass = :objectTypeClass and\n" + " (\n" - + " o.ownerRef.targetOid = :targetOid and\n" // TODO: fix for missing RoleType.F_OWNER_REF - + " o.ownerRef.relation in (:relation)\n" + + " o.ownerRefCampaign.targetOid = :targetOid and\n" + + " o.ownerRefCampaign.relation in (:relation)\n" + " )\n" + " ) or\n" + " (\n" + " o.objectTypeClass = :objectTypeClass2 and\n" + " (\n" - + " o.ownerRefCampaign.targetOid = :targetOid2 and\n" - + " o.ownerRefCampaign.relation in (:relation2)\n" + + " o.ownerRefDefinition.targetOid = :targetOid2 and\n" + + " o.ownerRefDefinition.relation in (:relation2)\n" + " )\n" + " ) or\n" + " (\n" + " o.objectTypeClass = :objectTypeClass3 and\n" + " (\n" - + " o.ownerRefDefinition.targetOid = :targetOid3 and\n" - + " o.ownerRefDefinition.relation in (:relation3)\n" - + " )\n" - + " ) or\n" - + " (\n" - + " o.objectTypeClass = :objectTypeClass4 and\n" - + " (\n" - + " o.ownerRefTask.targetOid = :targetOid4 and\n" - + " o.ownerRefTask.relation in (:relation4)\n" + + " o.ownerRefTask.targetOid = :targetOid3 and\n" + + " o.ownerRefTask.relation in (:relation3)\n" + " )\n" + " )\n" + " )\n"; @@ -2804,7 +2803,7 @@ public void test0630QueryGenericBoolean() throws Exception { assertEquals(1, objects.size()); PrismObject obj = objects.get(0); - assertTrue(obj.getCompileTimeClass().equals(GenericObjectType.class)); + assertEquals(GenericObjectType.class, obj.getCompileTimeClass()); result = new OperationResult("count"); long count = repositoryService.countObjects(GenericObjectType.class, objectQuery, null, result); @@ -2820,7 +2819,7 @@ public void test0630QueryGenericBoolean() throws Exception { public void test0640queryAssignmentExtensionBoolean() throws Exception { Session session = open(); try { - PrismPropertyDefinition propDef = prismContext.definitionFactory().createPropertyDefinition( + PrismPropertyDefinition propDef = prismContext.definitionFactory().createPropertyDefinition( SKIP_AUTOGENERATION_QNAME, DOMUtil.XSD_BOOLEAN); ObjectQuery objectQuery = prismContext.queryFor(UserType.class) @@ -2865,7 +2864,7 @@ public void test0640queryAssignmentExtensionBoolean() throws Exception { assertEquals(1, objects.size()); PrismObject obj = objects.get(0); - assertTrue(obj.getCompileTimeClass().equals(UserType.class)); + assertEquals(UserType.class, obj.getCompileTimeClass()); result = new OperationResult("count"); long count = repositoryService.countObjects(UserType.class, objectQuery, null, result); @@ -2990,8 +2989,9 @@ public void test0707QueryCertWorkItemAllOrderByCampaignName() throws Exception { public void test0710QueryCertCaseOwner() throws Exception { Session session = open(); try { - InOidFilter filter = prismContext.queryFactory().createOwnerHasOidIn("123456"); - ObjectQuery query = prismContext.queryFactory().createQuery(filter); + ObjectQuery query = prismContext.queryFor(AccessCertificationCaseType.class) + .ownerId("123456") + .build(); String real = getInterpretedQuery2(session, AccessCertificationCaseType.class, query, false); String expected = "select\n" + " a.ownerOid, a.id, a.fullObject\n" + @@ -4567,47 +4567,47 @@ private SqlRepositoryConfiguration getConfiguration() { // TODO negative tests - order by entity, reference, any, collection // TODO implement checks for "order by" for non-singletons - protected String getInterpretedQuery2(Session session, Class type, File file) throws + private String getInterpretedQuery2(Session session, Class type, File file) throws Exception { return getInterpretedQuery2(session, type, file, false); } - protected String getInterpretedQuery2(Session session, Class type, File file, + @SuppressWarnings("SameParameterValue") + private String getInterpretedQuery2(Session session, Class type, File file, boolean interpretCount) throws Exception { ObjectQuery query = getQuery(file, type); return getInterpretedQuery2(session, type, query, interpretCount); } @Nullable - private ObjectQuery getQuery(File file, Class type) + private ObjectQuery getQuery(File file, Class type) throws SchemaException, IOException { QueryType queryType = PrismTestUtil.parseAtomicValue(file, QueryType.COMPLEX_TYPE); logger.info("QUERY TYPE TO CONVERT : {}", ObjectQueryUtil.dump(queryType, prismContext)); - ObjectQuery query = null; try { - query = getQueryConverter().createObjectQuery(type, queryType); // TODO + return getQueryConverter().createObjectQuery(type, queryType); } catch (Exception ex) { logger.info("error while converting query: " + ex.getMessage(), ex); + return null; } - return query; } private QueryConverter getQueryConverter() { return prismContext.getQueryConverter(); } - protected String getInterpretedQuery2(Session session, Class type, ObjectQuery query) throws Exception { + private String getInterpretedQuery2(Session session, Class type, ObjectQuery query) throws Exception { return getInterpretedQuery2(session, type, query, false); } - protected String getInterpretedQuery2(Session session, Class type, ObjectQuery query, + private String getInterpretedQuery2(Session session, Class type, ObjectQuery query, boolean interpretCount) throws Exception { return getInterpretedQuery2(session, type, query, interpretCount, null); } - protected String getInterpretedQuery2(Session session, Class type, ObjectQuery query, + private String getInterpretedQuery2(Session session, Class type, ObjectQuery query, boolean interpretCount, Collection> options) throws Exception { RQuery rQuery = getInterpretedQuery2Whole(session, type, query, interpretCount, options); return ((RQueryImpl) rQuery).getQuery().getQueryString(); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index 65ece56b94b..dc58b9a319d 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -453,16 +453,8 @@ public void nonEmptyRoleTypeSearchTest() throws Exception { } - @Test(enabled = false) + @Test public void testIndividualOwnerRef() throws Exception { - testOwnerRef(RoleType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Admin-owned role"); - testOwnerRef(RoleType.class, null, "Judge", "Pirate"); - testOwnerRef(RoleType.class, "123"); - - testOwnerRef(OrgType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Admin-owned org"); - testOwnerRef(OrgType.class, null, "F0085"); - testOwnerRef(OrgType.class, "123"); - testOwnerRef(TaskType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Synchronization: Embedded Test OpenDJ"); testOwnerRef(TaskType.class, null, "Task with no owner"); testOwnerRef(TaskType.class, "123"); @@ -476,16 +468,8 @@ public void testIndividualOwnerRef() throws Exception { testOwnerRef(AccessCertificationDefinitionType.class, "123"); } - @Test(enabled = false) + @Test public void testOwnerRefWithTypeRestriction() throws Exception { - testOwnerRefWithTypeRestriction(RoleType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Admin-owned role"); - testOwnerRefWithTypeRestriction(RoleType.class, null, "Judge", "Pirate"); - testOwnerRefWithTypeRestriction(RoleType.class, "123"); - - testOwnerRefWithTypeRestriction(OrgType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Admin-owned org"); - testOwnerRefWithTypeRestriction(OrgType.class, null, "F0085"); - testOwnerRefWithTypeRestriction(OrgType.class, "123"); - testOwnerRefWithTypeRestriction(TaskType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), "Synchronization: Embedded Test OpenDJ"); testOwnerRefWithTypeRestriction(TaskType.class, null, "Task with no owner"); testOwnerRefWithTypeRestriction(TaskType.class, "123"); @@ -528,12 +512,14 @@ private void checkResult(Class queryClass, Class delegatedRefDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(RoleType.class).findItemDefinition(RoleType.F_DELEGATED_REF); + ItemDefinition ownerRefDef = prismContext.getSchemaRegistry() + .findObjectDefinitionByCompileTimeClass(TaskType.class) + .findItemDefinition(TaskType.F_OWNER_REF); ObjectQuery query = prismContext.queryFor(ObjectType.class) - .item(ItemPath.create(new QName(SchemaConstants.NS_C, "delegatedRef")), delegatedRefDef).ref(oid) + .item(ItemPath.create(new QName(SchemaConstants.NS_C, "ownerRef")), ownerRefDef).ref(oid) .build(); OperationResult result = new OperationResult("search"); try {