diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java index 783afbab0b3..b7d6fdf365f 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java @@ -95,17 +95,27 @@ protected Iterable identifyGarbage(final Set gcTypes } } - private Iterable getSplitDocuments() { - List conditions = Collections.emptyList(); - // absent support for SDTYPE as indexed property: exclude those - // documents from the query which definitively aren't split documents + // MODE==1 + private Iterable getSplitDocuments(final Set gcTypes, final long oldestRevTimeStamp) { + List conditions = new ArrayList<>(); + if (store.getTable(Collection.NODES).hasSplitDocs()) { + // we can add constraints on SDTYPE + List gcTypeCodes = new ArrayList<>(); + for (SplitDocType type : gcTypes) { + gcTypeCodes.add(type.typeCode()); + } + conditions.add(new QueryCondition(NodeDocument.SD_TYPE, "in", gcTypeCodes)); + conditions.add(new QueryCondition(NodeDocument.SD_MAX_REV_TIME_IN_SECS, "<=", NodeDocument.getModifiedInSecs(oldestRevTimeStamp))); + conditions.add(new QueryCondition(RDBDocumentStore.VERSIONPROP, ">=", 2)); + } + // in any case: exclude those documents from the query which definitively aren't split documents List excludeKeyPatterns = Arrays.asList("_:/%", "__:/%", "___:/%"); return getIterator(excludeKeyPatterns, conditions); } private Iterable identifyGarbageMode1(final Set gcTypes, final RevisionVector sweepRevs, final long oldestRevTimeStamp) { - return filter(getSplitDocuments(), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); + return filter(getSplitDocuments(gcTypes, oldestRevTimeStamp), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); } private Predicate getGarbageCheckPredicate(final Set gcTypes, final RevisionVector sweepRevs,