@NotNull @Override public List<ObjectFilter> createSpecificFilters(@NotNull WorkBucketType bucket, AbstractWorkSegmentationType configuration, Class<? extends ObjectType> type, Function<ItemPath, ItemDefinition<?>> itemDefinitionProvider) { AbstractWorkBucketContentType content = bucket.getContent(); if (hasNoBoundaries(content)) { return new ArrayList<>(); } if (configuration == null) { throw new IllegalStateException("No buckets configuration but having defined bucket content: " + content); } ItemPath discriminator = getDiscriminator(configuration, content); ItemDefinition<?> discriminatorDefinition = itemDefinitionProvider != null ? itemDefinitionProvider.apply(discriminator) : null; QName matchingRuleName = configuration.getMatchingRule() != null ? QNameUtil.uriToQName(configuration.getMatchingRule(), PrismConstants.NS_MATCHING_RULE) : null; List<ObjectFilter> filters = new ArrayList<>(); if (getFrom(content) != null) { filters.add(prismContext.queryFor(type) .item(discriminator, discriminatorDefinition).ge(getFrom(content)).matching(matchingRuleName) .buildFilter()); } if (getTo(content) != null) { filters.add(prismContext.queryFor(type) .item(discriminator, discriminatorDefinition).lt(getTo(content)).matching(matchingRuleName) .buildFilter()); } return filters; }
private void cleanupCampaignsByDate(Duration maxAge, Task task, OperationResult parentResult) { if (maxAge.getSign() > 0) { maxAge = maxAge.negate(); } Date deleteCampaignsFinishedUpTo = new Date(); maxAge.addTo(deleteCampaignsFinishedUpTo); LOGGER.info("Starting cleanup for closed certification campaigns deleting up to {} (max age '{}').", deleteCampaignsFinishedUpTo, maxAge); OperationResult result = parentResult.createSubresult(OPERATION_CLEANUP_CAMPAIGNS_BY_AGE); XMLGregorianCalendar timeXml = createXMLGregorianCalendar(deleteCampaignsFinishedUpTo); int deleted = 0; Set<String> poisonedCampaigns = new HashSet<>(); try { for (;;) { ObjectQuery query = prismContext.queryFor(AccessCertificationCampaignType.class) .item(AccessCertificationCampaignType.F_STATE).eq(AccessCertificationCampaignStateType.CLOSED) .and().item(AccessCertificationCampaignType.F_END_TIMESTAMP).lt(timeXml) .and().not().id(poisonedCampaigns.toArray(new String[0])) // hoping there are not many of these .maxSize(DELETE_BLOCK_SIZE) .build(); int delta = searchAndDeleteCampaigns(query, poisonedCampaigns, result, task); if (delta == 0) { LOGGER.info("Deleted {} campaigns.", deleted); return; } } } finally { result.computeStatusIfUnknown(); } }
public List<PrismContainerValue<WorkItemType>> searchApprovalWorkItems(int days, QName sortColumn) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException, DatatypeConfigurationException { Task task = taskManager.createTaskInstance(); OperationResult result = task.getResult(); ObjectQuery query = prismContext.queryFor(AbstractWorkItemType.class).build(); if (days > 0) { XMLGregorianCalendar since = (new Clock()).currentTimeXMLGregorianCalendar(); DatatypeFactory df = DatatypeFactory.newInstance(); since.add (df.newDuration(false, 0, 0, days, 0, 0, 0)); query.addFilter(prismContext.queryFor(AbstractWorkItemType.class) .item(AbstractWorkItemType.F_CREATE_TIMESTAMP).lt(since).buildFilter()); } if (sortColumn != null) { query.addFilter(prismContext.queryFor(AbstractWorkItemType.class) .asc(sortColumn) .buildFilter()); } Object[] itemsToResolve = { WorkItemType.F_ASSIGNEE_REF, ItemPath.create(PrismConstants.T_PARENT, WfContextType.F_OBJECT_REF), ItemPath.create(PrismConstants.T_PARENT, WfContextType.F_TARGET_REF), ItemPath.create(PrismConstants.T_PARENT, WfContextType.F_REQUESTER_REF) }; SearchResultList<WorkItemType> workItems = model.searchContainers(WorkItemType.class, query, schemaHelper.getOperationOptionsBuilder().items(itemsToResolve).resolve().build(), task, result); return PrismContainerValue.toPcvList(workItems); }
@Test public void test305GreaterLesserMatchingNorm() throws Exception { final String TEST_NAME = "test305GreaterLesserMatchingNorm"; displayTestTitle(TEST_NAME); ObjectQuery q = getPrismContext().queryFor(UserType.class) .item(UserType.F_NAME).ge(new PolyString("00", "00")).matchingNorm() .and().item(UserType.F_NAME).lt(new PolyString("0a", "0a")).matchingNorm() .build(); checkQueryRoundtripFile(UserType.class, q, TEST_NAME); }
@Test public void test0200QueryTriggerTimestampDoubleWrong() throws Exception { final Date NOW = new Date(); Session session = open(); try { XMLGregorianCalendar thisScanTimestamp = XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime()); ObjectQuery query = prismContext.queryFor(ObjectType.class) .item(ObjectType.F_TRIGGER, F_TIMESTAMP).gt(thisScanTimestamp) .and().item(ObjectType.F_TRIGGER, F_TIMESTAMP).lt(thisScanTimestamp) .build(); LOGGER.info(query.debugDump()); String real = getInterpretedQuery2(session, ObjectType.class, query); // correct translation but the filter is wrong: we need to point to THE SAME timestamp -> i.e. ForValue should be used here String expected = "select\n" + " o.oid, o.fullObject, o.stringsCount, o.longsCount, o.datesCount, o.referencesCount, o.polysCount, o.booleansCount\n" + "from\n" + " RObject o\n" + " left join o.trigger t\n" + " left join o.trigger t2\n" + "where\n" + " (\n" + " t.timestamp > :timestamp and\n" + " t2.timestamp < :timestamp2\n" + " )\n"; assertEqualsIgnoreWhitespace(expected, real); } finally { close(session); } }
ObjectQuery q1 = prismContext.queryFor(UserType.class) .item(UserType.F_ITERATION).ge(BigInteger.valueOf(0)) .and().item(UserType.F_ITERATION).lt(BigInteger.valueOf(10)) .build(); ObjectQuery q2 = prismContext.queryFor(UserType.class) .item(UserType.F_ITERATION).ge(BigInteger.valueOf(10)) .and().item(UserType.F_ITERATION).lt(BigInteger.valueOf(20)) .build(); ObjectQuery q3 = prismContext.queryFor(UserType.class) .item(UserType.F_ITERATION).ge(BigInteger.valueOf(20)) .and().item(UserType.F_ITERATION).lt(BigInteger.valueOf(30)) .build(); PrismAsserts.assertQueriesEquivalent("Wrong query #1", q1, qe.get(0));
@Test public void test1320OidGeLtTest() throws Exception { Session session = open(); try { ObjectQuery query = prismContext.queryFor(ObjectType.class) .item(PrismConstants.T_ID).ge("1") .and().item(PrismConstants.T_ID).lt("2") .build(); String real = getInterpretedQuery2(session, ObjectType.class, query, false); String expected = "select\n" + " o.oid, o.fullObject,\n" + " o.stringsCount,\n" + " o.longsCount,\n" + " o.datesCount,\n" + " o.referencesCount,\n" + " o.polysCount,\n" + " o.booleansCount\n" + "from\n" + " RObject o\n" + "where\n" + " ( o.oid >= :oid and o.oid < :oid2 )\n"; assertEqualsIgnoreWhitespace(expected, real); } finally { close(session); } }
@Test public void test310AllComparisons() throws Exception { final String TEST_NAME = "test310AllComparisons"; displayTestTitle(TEST_NAME); ObjectQuery q = getPrismContext().queryFor(UserType.class) .item(UserType.F_COST_CENTER).gt("100000") .and().item(UserType.F_COST_CENTER).lt("999999") .or() .item(UserType.F_COST_CENTER).ge("X100") .and().item(UserType.F_COST_CENTER).le("X999") .build(); checkQueryRoundtripFile(UserType.class, q, TEST_NAME); }
.item(F_NAME).eqPoly("generic object", "generic object").matchingNorm() .and().item(F_EXTENSION, new QName("intType")).ge(100) .and().item(F_EXTENSION, new QName("intType")).lt(200) .and().item(F_EXTENSION, new QName("longType")).eq(335) .build();
.item(ShadowType.F_SYNCHRONIZATION_TIMESTAMP).lt(description.getTimestamp()) .build(); List<PrismObject<ShadowType>> shadows = repositoryService.searchObjects(ShadowType.class, query, null, result);
ObjectQuery query = prismContext.queryFor(AccessCertificationCampaignType.class) .item(AccessCertificationCampaignType.F_STATE).eq(AccessCertificationCampaignStateType.CLOSED) .and().item(AccessCertificationCampaignType.F_END_TIMESTAMP).lt(XmlTypeConverter.createXMLGregorianCalendar(System.currentTimeMillis())) .and().not().id(new String[0]) .maxSize(10)
assertOptimizedCompletedBuckets(taskAfter); ObjectQuery expectedQuery = prismContext.queryFor(UserType.class) .item(UserType.F_ITERATION).lt(BigInteger.valueOf(123)) .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query", expectedQuery, narrowedQuery); .and().item(UserType.F_ITERATION).lt(BigInteger.valueOf(200)) .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query (2)", expectedQuery, narrowedQuery);
.item(WorkItemType.F_CREATE_TIMESTAMP).lt(XmlTypeConverter.createXMLGregorianCalendar(System.currentTimeMillis())) .and().item(WorkItemType.F_CREATE_TIMESTAMP).gt(XmlTypeConverter.createXMLGregorianCalendar(System.currentTimeMillis()-300000)) .build();
display("narrowed query (1)", narrowedQuery); ObjectQuery expectedQuery = prismContext.queryFor(UserType.class) .item(UserType.F_NAME).lt("00").matchingNorm() .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query (1)", expectedQuery, narrowedQuery); expectedQuery = prismContext.queryFor(UserType.class) .item(UserType.F_NAME).ge("00").matchingNorm() .and().item(UserType.F_NAME).lt("0a").matchingNorm() .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query (2)", expectedQuery, narrowedQuery);
assertOptimizedCompletedBuckets(taskAfter); ObjectQuery expectedQuery = prismContext.queryFor(ShadowType.class) .item(ShadowType.F_NAME).lt(new PolyString("a", "a")) .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query", expectedQuery, narrowedQuery); .and().item(ShadowType.F_NAME).lt(new PolyString("m", "m")) .build(); PrismAsserts.assertQueriesEquivalent("Wrong narrowed query (2)", expectedQuery, narrowedQuery);