Hi,

While trying to execute a query like

select [jcr:path], [jcr:score], * from [nt:unstructured] as a where
[sling:resourceType] = 'dam/smartcollection' and isdescendantnode(a,
'/content/dam')

where index does exist for sling:resourceType the explain shows that
its using the NodeType index for jcr:primaryType

[nt:unstructured] as [a] /* Filter(query=explain select [jcr:path],
[jcr:score], *
    from [nt:unstructured] as a
    where [sling:resourceType] = 'dam/smartcollection'
    and isdescendantnode(a, '/content/dam')
, path=/content/dam//*,
property=[sling:resourceType=dam/smartcollection]) where
([a].[sling:resourceType] = cast('dam/smartcollection' as string)) and
(isdescendantnode([a], [/content/dam])) */

The problem I think is the way cost is determined in [1]. Current
implementation returns cost as zero if count returned by the
IndexStoreStrategy is zero. This forces the query engine to use this
index. I think it should return a value less than
Double.POSITIVE_INFINITY but greater than zero probably MAX_COST to
indicate that it can participate but there is some cost

-        return store.count(indexMeta, encode(value), MAX_COST);
+        long count = store.count(indexMeta, encode(value), MAX_COST);
+        return (count == 0) ? MAX_COST : count;

With the logic changed above the plan changes to

[nt:unstructured] as [a] /* property
sling:resourceType=dam/smartcollection where ([a].[sling:resourceType]
= cast('dam/smartcollection' as string)) and (isdescendantnode([a],
[/content/dam])) */

Any pointers?

Chetan Mehrotra
[1] 
https://github.com/apache/jackrabbit-oak/blob/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java#L110

Reply via email to