/** * Creates a {@link DeduplicationOption} query option, encapsulating a given {@link DeduplicationStrategy}, which * when supplied to the query engine requests it to eliminate duplicates objects from the results returned using * the strategy indicated. * * @param deduplicationStrategy The deduplication strategy the query engine should use * @return A {@link DeduplicationOption} query option, requests duplicate objects to be eliminated from results */ static DeduplicationOption deduplicate(DeduplicationStrategy deduplicationStrategy) { return new DeduplicationOption(deduplicationStrategy); }
final QueryOptions queryOptions, final int retrievalCost) { boolean logicalElimination = DeduplicationOption.isLogicalElimination(queryOptions); boolean attributeHasAtMostOneValue = (attribute instanceof SimpleAttribute || attribute instanceof SimpleNullableAttribute); boolean queryIsADisjointInQuery = query instanceof In && ((In) query).isDisjoint();
/** * Utility method to extract a {@link DeduplicationOption} object from the query options provided, and to check * if the strategy specified is {@link DeduplicationStrategy#MATERIALIZE}. * * @param queryOptions The query options to check * @return True if {@link DeduplicationOption} object is contained in those provided and its strategy is * {@link DeduplicationStrategy#MATERIALIZE} */ public static <O> boolean isMaterialize(QueryOptions queryOptions) { DeduplicationOption option = queryOptions.get(DeduplicationOption.class); return option != null && DeduplicationStrategy.MATERIALIZE.equals(option.getStrategy()); }
/** * Retrieve results and then sort them afterwards (if sorting is required). */ ResultSet<O> retrieveWithoutIndexOrdering(Query<O> query, QueryOptions queryOptions, OrderByOption<O> orderByOption) { ResultSet<O> resultSet; resultSet = retrieveRecursive(query, queryOptions); // Check if we need to wrap ResultSet to order and/or deduplicate results (deduplicate using MATERIAIZE rather // than LOGICAL_ELIMINATION strategy)... final boolean applyMaterializedDeduplication = DeduplicationOption.isMaterialize(queryOptions); if (orderByOption != null) { // An OrderByOption was specified, wrap the results in an MaterializedOrderedResultSet. // -> This will implicitly sort AND deduplicate the results returned by the ResultSet.iterator() method. // -> However note this does not mean we will also deduplicate the count returned by ResultSet.size()! // -> Deduplicating the count returned by size() is expensive, so we only do this if the client // requested both ordering AND deduplication explicitly (hence we pass applyMaterializeDeduplication)... Comparator<O> comparator = new AttributeOrdersComparator<O>(orderByOption.getAttributeOrders(), queryOptions); resultSet = new MaterializedOrderedResultSet<O>(resultSet, comparator, applyMaterializedDeduplication); } else if (applyMaterializedDeduplication) { // A DeduplicationOption was specified, wrap the results in an MaterializedDeduplicatedResultSet, // which will deduplicate (but not sort) results. O(n) time complexity to subsequently iterate... resultSet = new MaterializedDeduplicatedResultSet<O>(resultSet); } return resultSet; }
if (DeduplicationOption.isLogicalElimination(queryOptions) && !(getAttribute() instanceof SimpleAttribute || getAttribute() instanceof SimpleNullableAttribute)) { return new ResultSetUnion<O>(results, query, queryOptions) {
/** * Utility method to extract a {@link DeduplicationOption} object from the query options provided, and to check * if the strategy specified is {@link DeduplicationStrategy#LOGICAL_ELIMINATION}. * * @param queryOptions The query options to check * @return True if {@link DeduplicationOption} object is contained in those provided and its strategy is * {@link DeduplicationStrategy#LOGICAL_ELIMINATION} */ public static <O> boolean isLogicalElimination(QueryOptions queryOptions) { DeduplicationOption option = queryOptions.get(DeduplicationOption.class); return option != null && DeduplicationStrategy.LOGICAL_ELIMINATION.equals(option.getStrategy()); }
/** * Creates a {@link DeduplicationOption} query option, encapsulating a given {@link DeduplicationStrategy}, which * when supplied to the query engine requests it to eliminate duplicates objects from the results returned using * the strategy indicated. * * @param deduplicationStrategy The deduplication strategy the query engine should use * @return A {@link DeduplicationOption} query option, requests duplicate objects to be eliminated from results */ public static DeduplicationOption deduplicate(DeduplicationStrategy deduplicationStrategy) { return new DeduplicationOption(deduplicationStrategy); }
if (DeduplicationOption.isLogicalElimination(queryOptions) && !(getAttribute() instanceof SimpleAttribute || getAttribute() instanceof SimpleNullableAttribute)) { return new ResultSetUnion<O>(results, query, queryOptions) {
/** * Creates a {@link DeduplicationOption} query option, encapsulating a given {@link DeduplicationStrategy}, which * when supplied to the query engine requests it to eliminate duplicates objects from the results returned using * the strategy indicated. * * @param deduplicationStrategy The deduplication strategy the query engine should use * @return A {@link DeduplicationOption} query option, requests duplicate objects to be eliminated from results */ @Deprecated static DeduplicationOption deduplicate(DeduplicationStrategy deduplicationStrategy) { return new DeduplicationOption(deduplicationStrategy); }
if (DeduplicationOption.isLogicalElimination(queryOptions) && !(getAttribute() instanceof SimpleAttribute || getAttribute() instanceof SimpleNullableAttribute)) { return new ResultSetUnion<O>(results, query, queryOptions) {
Query<O> query = queriesTyped.size() == 1 ? queriesTyped.iterator().next() : new Or<O>(queriesTyped); if (DeduplicationOption.isLogicalElimination(queryOptions)) { boolean indexMergeStrategyEnabled = isFlagEnabled(queryOptions, PREFER_INDEX_MERGE_STRATEGY); return new ResultSetUnion<O>(resultSetsToUnion, query, queryOptions, indexMergeStrategyEnabled);
ResultSet<O> union; if (DeduplicationOption.isLogicalElimination(queryOptionsForOrUnion)) { union = new ResultSetUnion<O>(resultSetsToUnion, query, queryOptions, indexMergeStrategyEnabled);