fabriziofortino commented on a change in pull request #469:
URL: https://github.com/apache/jackrabbit-oak/pull/469#discussion_r792650039



##########
File path: 
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/dynamicBoost/DynamicBoostTest.java
##########
@@ -77,101 +77,280 @@ protected void createTestIndexNode() throws Exception {
     @Override
     protected ContentRepository createRepository() {
         IndexTracker tracker = new IndexTracker();
-        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null,
-                new ExtractedTextCache(0, 0),
-                factory, Mounts.defaultMountInfoProvider());
-        LuceneIndexProvider provider = new LuceneIndexProvider(tracker,
-                factory);
-        return new Oak()
-                .with(new OpenSecurityProvider())
+        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), factory,
+                Mounts.defaultMountInfoProvider());
+        LuceneIndexProvider provider = new LuceneIndexProvider(tracker, 
factory);
+        return new Oak().with(new OpenSecurityProvider())
                 .with((QueryIndexProvider) provider)
                 .with((Observer) provider)
                 .with(editorProvider)
                 .createContentRepository();
     }
 
-    @Test public void withFieldProvider() throws Exception {
+    // Section 1. indexing test
+    @Test
+    public void testIndexingFieldProvider() throws Exception {
         NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        createIndex("dam:Asset");
+        createIndex("dam:Asset", false);
         root.commit();
         factory.indexFieldProvider = new IndexFieldProviderImpl();
+        factory.queryTermsProvider = new FulltextQueryTermsProviderImpl();
 
-        String log = runTest(IndexFieldProviderImpl.class, true);
-        assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" +
-                        "]", log);
+        String log = runIndexingTest(IndexFieldProviderImpl.class, true);
+        assertEquals("[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" + "]", log);
     }
 
-    @Test public void withDynamicBoost() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoost() throws Exception {
+        createAssetsIndexAndProperties(false, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "name is an array: jcr:content/metadata/predictedTags, 
" +
-                        "name is an array: jcr:content/metadata/predictedTags" 
+
-                        "]", log);
-    }
-
-    @Test public void withDynamicBoostLite() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset", true);
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+                "[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " + "Added augmented 
fields: jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " + "confidence 
is not finite: jcr:content/metadata/predictedTags, " + "confidence is not 
finite: jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags" + "]",
+                log);
+    }
+
+    @Test
+    public void testIndexingDynamicBoostLite() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals("[]", log);
     }
 
-    @Test public void withDynamicBoostMissingProperty() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoostMissingProperty() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, false);
+        String log = runIndexingTest(LuceneDocumentMaker.class, false);
         assertEquals("[]", log);
     }
 
-    private String runTest(Class<?> loggerClass, boolean nameProperty) throws 
CommitFailedException {
-        LogCustomizer customLogs = LogCustomizer
-                .forLogger(loggerClass)
-                .enable(Level.TRACE).create();
+    // verifying fulltext query syntax ability, put here for comparison with 
dynamic boost and dynamic boost lite
+    @Test
+    public void testQueryFullTextWithTitle() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'titleone')]", 
XPATH, Arrays.asList("/test/asset1"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // case insensitive
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'LONG')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // wildcard works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'title*')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        // space is treated as AND
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
titleone')]", XPATH, Arrays.asList("/test/asset1"));
+        // OR works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long OR 
titleone')]", XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+        // minus works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+    }
+
+    // Section 2. Query dynamicboost testing
+    @Test
+    public void testQueryDynamicBoostBasic() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant " + 
"((jcr:content/metadata/predictedTags/plant:1 
jcr:content/metadata/predictedTags/plant:1)^1.0E-4) ft:(\"plant\")\n" + "  
where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    // dynamic boost: query should be case insensitive
+    @Test
+    public void testQueryDynamicBoostCaseInsensitive() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'FLOWER')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore //todo: bug? wildcard doesn't work at all for dynamic boost term

Review comment:
       this cannot work with standard dynamic boost since the terms are the 
field names. I would remove this test

##########
File path: 
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/dynamicBoost/DynamicBoostTest.java
##########
@@ -77,101 +77,280 @@ protected void createTestIndexNode() throws Exception {
     @Override
     protected ContentRepository createRepository() {
         IndexTracker tracker = new IndexTracker();
-        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null,
-                new ExtractedTextCache(0, 0),
-                factory, Mounts.defaultMountInfoProvider());
-        LuceneIndexProvider provider = new LuceneIndexProvider(tracker,
-                factory);
-        return new Oak()
-                .with(new OpenSecurityProvider())
+        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), factory,
+                Mounts.defaultMountInfoProvider());
+        LuceneIndexProvider provider = new LuceneIndexProvider(tracker, 
factory);
+        return new Oak().with(new OpenSecurityProvider())
                 .with((QueryIndexProvider) provider)
                 .with((Observer) provider)
                 .with(editorProvider)
                 .createContentRepository();
     }
 
-    @Test public void withFieldProvider() throws Exception {
+    // Section 1. indexing test
+    @Test
+    public void testIndexingFieldProvider() throws Exception {
         NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        createIndex("dam:Asset");
+        createIndex("dam:Asset", false);
         root.commit();
         factory.indexFieldProvider = new IndexFieldProviderImpl();
+        factory.queryTermsProvider = new FulltextQueryTermsProviderImpl();
 
-        String log = runTest(IndexFieldProviderImpl.class, true);
-        assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" +
-                        "]", log);
+        String log = runIndexingTest(IndexFieldProviderImpl.class, true);
+        assertEquals("[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" + "]", log);
     }
 
-    @Test public void withDynamicBoost() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoost() throws Exception {
+        createAssetsIndexAndProperties(false, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "name is an array: jcr:content/metadata/predictedTags, 
" +
-                        "name is an array: jcr:content/metadata/predictedTags" 
+
-                        "]", log);
-    }
-
-    @Test public void withDynamicBoostLite() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset", true);
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+                "[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " + "Added augmented 
fields: jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " + "confidence 
is not finite: jcr:content/metadata/predictedTags, " + "confidence is not 
finite: jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags" + "]",
+                log);
+    }
+
+    @Test
+    public void testIndexingDynamicBoostLite() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals("[]", log);
     }
 
-    @Test public void withDynamicBoostMissingProperty() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoostMissingProperty() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, false);
+        String log = runIndexingTest(LuceneDocumentMaker.class, false);
         assertEquals("[]", log);
     }
 
-    private String runTest(Class<?> loggerClass, boolean nameProperty) throws 
CommitFailedException {
-        LogCustomizer customLogs = LogCustomizer
-                .forLogger(loggerClass)
-                .enable(Level.TRACE).create();
+    // verifying fulltext query syntax ability, put here for comparison with 
dynamic boost and dynamic boost lite
+    @Test
+    public void testQueryFullTextWithTitle() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'titleone')]", 
XPATH, Arrays.asList("/test/asset1"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // case insensitive
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'LONG')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // wildcard works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'title*')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        // space is treated as AND
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
titleone')]", XPATH, Arrays.asList("/test/asset1"));
+        // OR works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long OR 
titleone')]", XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+        // minus works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+    }
+
+    // Section 2. Query dynamicboost testing
+    @Test
+    public void testQueryDynamicBoostBasic() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant " + 
"((jcr:content/metadata/predictedTags/plant:1 
jcr:content/metadata/predictedTags/plant:1)^1.0E-4) ft:(\"plant\")\n" + "  
where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    // dynamic boost: query should be case insensitive
+    @Test
+    public void testQueryDynamicBoostCaseInsensitive() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'FLOWER')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore //todo: bug? wildcard doesn't work at all for dynamic boost term
+    @Test
+    public void testQueryDynamicBoostWildcard() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blu*')]", XPATH, 
Arrays.asList("/test/asset3"));
+    }
+
+    // dynamic boost: should respect confidence as query result order
+    @Test
+    public void testQueryDynamicBoostOrder() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertOrderedQuery("select [jcr:path] from [dam:Asset] where 
contains(*, 'plant')",
+                Arrays.asList("/test/asset2", "/test/asset3", "/test/asset1"));
+    }
+
+    // dynamic boost: space is explained as OR instead of AND which is 
documented as fulltext query in OAK doc todo: should be documented
+    @Test
+    public void testQueryDynamicBoostSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue flower')", SQL2,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryDynamicBoostOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue OR coffee')", SQL2,
+                Arrays.asList("/test/asset2", "/test/asset3"));
+    }
+
+    @Ignore // todo: failed, minus doesn't work

Review comment:
       I would remove this test too. Lucene syntax cannot be supported with 
dynamic boost.

##########
File path: 
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/dynamicBoost/DynamicBoostTest.java
##########
@@ -77,101 +77,280 @@ protected void createTestIndexNode() throws Exception {
     @Override
     protected ContentRepository createRepository() {
         IndexTracker tracker = new IndexTracker();
-        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null,
-                new ExtractedTextCache(0, 0),
-                factory, Mounts.defaultMountInfoProvider());
-        LuceneIndexProvider provider = new LuceneIndexProvider(tracker,
-                factory);
-        return new Oak()
-                .with(new OpenSecurityProvider())
+        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), factory,
+                Mounts.defaultMountInfoProvider());
+        LuceneIndexProvider provider = new LuceneIndexProvider(tracker, 
factory);
+        return new Oak().with(new OpenSecurityProvider())
                 .with((QueryIndexProvider) provider)
                 .with((Observer) provider)
                 .with(editorProvider)
                 .createContentRepository();
     }
 
-    @Test public void withFieldProvider() throws Exception {
+    // Section 1. indexing test
+    @Test
+    public void testIndexingFieldProvider() throws Exception {
         NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        createIndex("dam:Asset");
+        createIndex("dam:Asset", false);
         root.commit();
         factory.indexFieldProvider = new IndexFieldProviderImpl();
+        factory.queryTermsProvider = new FulltextQueryTermsProviderImpl();
 
-        String log = runTest(IndexFieldProviderImpl.class, true);
-        assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" +
-                        "]", log);
+        String log = runIndexingTest(IndexFieldProviderImpl.class, true);
+        assertEquals("[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" + "]", log);
     }
 
-    @Test public void withDynamicBoost() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoost() throws Exception {
+        createAssetsIndexAndProperties(false, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "name is an array: jcr:content/metadata/predictedTags, 
" +
-                        "name is an array: jcr:content/metadata/predictedTags" 
+
-                        "]", log);
-    }
-
-    @Test public void withDynamicBoostLite() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset", true);
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+                "[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " + "Added augmented 
fields: jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " + "confidence 
is not finite: jcr:content/metadata/predictedTags, " + "confidence is not 
finite: jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags" + "]",
+                log);
+    }
+
+    @Test
+    public void testIndexingDynamicBoostLite() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals("[]", log);
     }
 
-    @Test public void withDynamicBoostMissingProperty() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoostMissingProperty() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, false);
+        String log = runIndexingTest(LuceneDocumentMaker.class, false);
         assertEquals("[]", log);
     }
 
-    private String runTest(Class<?> loggerClass, boolean nameProperty) throws 
CommitFailedException {
-        LogCustomizer customLogs = LogCustomizer
-                .forLogger(loggerClass)
-                .enable(Level.TRACE).create();
+    // verifying fulltext query syntax ability, put here for comparison with 
dynamic boost and dynamic boost lite
+    @Test
+    public void testQueryFullTextWithTitle() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'titleone')]", 
XPATH, Arrays.asList("/test/asset1"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // case insensitive
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'LONG')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // wildcard works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'title*')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        // space is treated as AND
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
titleone')]", XPATH, Arrays.asList("/test/asset1"));
+        // OR works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long OR 
titleone')]", XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+        // minus works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+    }
+
+    // Section 2. Query dynamicboost testing
+    @Test
+    public void testQueryDynamicBoostBasic() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant " + 
"((jcr:content/metadata/predictedTags/plant:1 
jcr:content/metadata/predictedTags/plant:1)^1.0E-4) ft:(\"plant\")\n" + "  
where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    // dynamic boost: query should be case insensitive
+    @Test
+    public void testQueryDynamicBoostCaseInsensitive() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'FLOWER')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore //todo: bug? wildcard doesn't work at all for dynamic boost term
+    @Test
+    public void testQueryDynamicBoostWildcard() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blu*')]", XPATH, 
Arrays.asList("/test/asset3"));
+    }
+
+    // dynamic boost: should respect confidence as query result order
+    @Test
+    public void testQueryDynamicBoostOrder() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertOrderedQuery("select [jcr:path] from [dam:Asset] where 
contains(*, 'plant')",
+                Arrays.asList("/test/asset2", "/test/asset3", "/test/asset1"));
+    }
+
+    // dynamic boost: space is explained as OR instead of AND which is 
documented as fulltext query in OAK doc todo: should be documented
+    @Test
+    public void testQueryDynamicBoostSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue flower')", SQL2,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryDynamicBoostOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue OR coffee')", SQL2,
+                Arrays.asList("/test/asset2", "/test/asset3"));
+    }
+
+    @Ignore // todo: failed, minus doesn't work
+    @Test
+    public void testQueryDynamicBoostMinus() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'plant -flower')", SQL2, Arrays.asList("/test/asset3"));
+    }
+
+
+    @Ignore
+    //todo: bug? if both terms are dynamic boost, whitespace work as OR, but 
combine with fulltext term, the fulltext term don't respected at all
+    // if it's AND, it should return empty, if it's OR, it should return all 3 
assets, but here it only return asset3, the fulltext term "long" is ignored
+    @Test
+    public void testQueryMixSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blue long')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryMixOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        // explicit OR works as expected
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blue OR 
long')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }

Review comment:
       I actually don't know how the latter works. We should investigate this.

##########
File path: 
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/dynamicBoost/DynamicBoostTest.java
##########
@@ -77,101 +77,280 @@ protected void createTestIndexNode() throws Exception {
     @Override
     protected ContentRepository createRepository() {
         IndexTracker tracker = new IndexTracker();
-        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null,
-                new ExtractedTextCache(0, 0),
-                factory, Mounts.defaultMountInfoProvider());
-        LuceneIndexProvider provider = new LuceneIndexProvider(tracker,
-                factory);
-        return new Oak()
-                .with(new OpenSecurityProvider())
+        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), factory,
+                Mounts.defaultMountInfoProvider());
+        LuceneIndexProvider provider = new LuceneIndexProvider(tracker, 
factory);
+        return new Oak().with(new OpenSecurityProvider())
                 .with((QueryIndexProvider) provider)
                 .with((Observer) provider)
                 .with(editorProvider)
                 .createContentRepository();
     }
 
-    @Test public void withFieldProvider() throws Exception {
+    // Section 1. indexing test
+    @Test
+    public void testIndexingFieldProvider() throws Exception {
         NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        createIndex("dam:Asset");
+        createIndex("dam:Asset", false);
         root.commit();
         factory.indexFieldProvider = new IndexFieldProviderImpl();
+        factory.queryTermsProvider = new FulltextQueryTermsProviderImpl();
 
-        String log = runTest(IndexFieldProviderImpl.class, true);
-        assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" +
-                        "]", log);
+        String log = runIndexingTest(IndexFieldProviderImpl.class, true);
+        assertEquals("[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" + "]", log);
     }
 
-    @Test public void withDynamicBoost() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoost() throws Exception {
+        createAssetsIndexAndProperties(false, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "name is an array: jcr:content/metadata/predictedTags, 
" +
-                        "name is an array: jcr:content/metadata/predictedTags" 
+
-                        "]", log);
-    }
-
-    @Test public void withDynamicBoostLite() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset", true);
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+                "[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " + "Added augmented 
fields: jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " + "confidence 
is not finite: jcr:content/metadata/predictedTags, " + "confidence is not 
finite: jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags" + "]",
+                log);
+    }
+
+    @Test
+    public void testIndexingDynamicBoostLite() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals("[]", log);
     }
 
-    @Test public void withDynamicBoostMissingProperty() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoostMissingProperty() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, false);
+        String log = runIndexingTest(LuceneDocumentMaker.class, false);
         assertEquals("[]", log);
     }
 
-    private String runTest(Class<?> loggerClass, boolean nameProperty) throws 
CommitFailedException {
-        LogCustomizer customLogs = LogCustomizer
-                .forLogger(loggerClass)
-                .enable(Level.TRACE).create();
+    // verifying fulltext query syntax ability, put here for comparison with 
dynamic boost and dynamic boost lite
+    @Test
+    public void testQueryFullTextWithTitle() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'titleone')]", 
XPATH, Arrays.asList("/test/asset1"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // case insensitive
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'LONG')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // wildcard works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'title*')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        // space is treated as AND
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
titleone')]", XPATH, Arrays.asList("/test/asset1"));
+        // OR works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long OR 
titleone')]", XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+        // minus works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+    }
+
+    // Section 2. Query dynamicboost testing
+    @Test
+    public void testQueryDynamicBoostBasic() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant " + 
"((jcr:content/metadata/predictedTags/plant:1 
jcr:content/metadata/predictedTags/plant:1)^1.0E-4) ft:(\"plant\")\n" + "  
where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    // dynamic boost: query should be case insensitive
+    @Test
+    public void testQueryDynamicBoostCaseInsensitive() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'FLOWER')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore //todo: bug? wildcard doesn't work at all for dynamic boost term
+    @Test
+    public void testQueryDynamicBoostWildcard() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blu*')]", XPATH, 
Arrays.asList("/test/asset3"));
+    }
+
+    // dynamic boost: should respect confidence as query result order
+    @Test
+    public void testQueryDynamicBoostOrder() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertOrderedQuery("select [jcr:path] from [dam:Asset] where 
contains(*, 'plant')",
+                Arrays.asList("/test/asset2", "/test/asset3", "/test/asset1"));
+    }
+
+    // dynamic boost: space is explained as OR instead of AND which is 
documented as fulltext query in OAK doc todo: should be documented
+    @Test
+    public void testQueryDynamicBoostSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue flower')", SQL2,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryDynamicBoostOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue OR coffee')", SQL2,
+                Arrays.asList("/test/asset2", "/test/asset3"));
+    }
+
+    @Ignore // todo: failed, minus doesn't work
+    @Test
+    public void testQueryDynamicBoostMinus() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'plant -flower')", SQL2, Arrays.asList("/test/asset3"));
+    }
+
+
+    @Ignore
+    //todo: bug? if both terms are dynamic boost, whitespace work as OR, but 
combine with fulltext term, the fulltext term don't respected at all
+    // if it's AND, it should return empty, if it's OR, it should return all 3 
assets, but here it only return asset3, the fulltext term "long" is ignored
+    @Test
+    public void testQueryMixSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blue long')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryMixOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        // explicit OR works as expected
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blue OR 
long')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Ignore //todo: bug? minus doesn't work at for neither fulltext term nor 
dynamic boost term
+    @Test
+    public void testQueryMixMinus() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        // dynamicBoost term then minus fulltext term
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+        // fulltext term then minus dynamicBoost term
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-coffee')]", XPATH, Arrays.asList("/test/asset1"));
+    }
+
+
+    // Section 3. Query dynamicboost lite testing
+    @Test
+    public void testQueryDynamicBoostLiteBasic() throws Exception {
+        createAssetsIndexAndProperties(true, true);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant simtags:plant 
ft:(\"plant\")\n  where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore // dynamic boost lite: dynamic boost lite don't work as case 
insensitive like dynamic boost, todo: log a bug?

Review comment:
       yes, this is a bug

##########
File path: 
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/dynamicBoost/DynamicBoostTest.java
##########
@@ -77,101 +77,280 @@ protected void createTestIndexNode() throws Exception {
     @Override
     protected ContentRepository createRepository() {
         IndexTracker tracker = new IndexTracker();
-        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null,
-                new ExtractedTextCache(0, 0),
-                factory, Mounts.defaultMountInfoProvider());
-        LuceneIndexProvider provider = new LuceneIndexProvider(tracker,
-                factory);
-        return new Oak()
-                .with(new OpenSecurityProvider())
+        LuceneIndexEditorProvider editorProvider = new 
LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), factory,
+                Mounts.defaultMountInfoProvider());
+        LuceneIndexProvider provider = new LuceneIndexProvider(tracker, 
factory);
+        return new Oak().with(new OpenSecurityProvider())
                 .with((QueryIndexProvider) provider)
                 .with((Observer) provider)
                 .with(editorProvider)
                 .createContentRepository();
     }
 
-    @Test public void withFieldProvider() throws Exception {
+    // Section 1. indexing test
+    @Test
+    public void testIndexingFieldProvider() throws Exception {
         NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        createIndex("dam:Asset");
+        createIndex("dam:Asset", false);
         root.commit();
         factory.indexFieldProvider = new IndexFieldProviderImpl();
+        factory.queryTermsProvider = new FulltextQueryTermsProviderImpl();
 
-        String log = runTest(IndexFieldProviderImpl.class, true);
-        assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" +
-                        "]", log);
+        String log = runIndexingTest(IndexFieldProviderImpl.class, true);
+        assertEquals("[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0" + "]", log);
     }
 
-    @Test public void withDynamicBoost() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoost() throws Exception {
+        createAssetsIndexAndProperties(false, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals(
-                "[" +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " +
-                        "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is not finite: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence parsing failed: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "confidence is an array: 
jcr:content/metadata/predictedTags, " +
-                        "name is an array: jcr:content/metadata/predictedTags, 
" +
-                        "name is an array: jcr:content/metadata/predictedTags" 
+
-                        "]", log);
-    }
-
-    @Test public void withDynamicBoostLite() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset", true);
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+                "[" + "Added augmented fields: 
jcr:content/metadata/predictedTags/[my, a, my:a], 10.0, " + "Added augmented 
fields: jcr:content/metadata/predictedTags/[my, a, my:a], 30.0, " + "confidence 
is not finite: jcr:content/metadata/predictedTags, " + "confidence is not 
finite: jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence parsing failed: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "confidence is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags, " + "name is an array: 
jcr:content/metadata/predictedTags" + "]",
+                log);
+    }
+
+    @Test
+    public void testIndexingDynamicBoostLite() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, true);
+        String log = runIndexingTest(LuceneDocumentMaker.class, true);
         assertEquals("[]", log);
     }
 
-    @Test public void withDynamicBoostMissingProperty() throws Exception {
-        NodeTypeRegistry.register(root, toInputStream(ASSET_NODE_TYPE), "test 
nodeType");
-        Tree props = createIndex("dam:Asset");
-        Tree pt = createNodeWithType(props, "predictedTags", UNSTRUCTURED);
-        pt.setProperty("name", "jcr:content/metadata/predictedTags/.*");
-        pt.setProperty("isRegexp", true);
-        pt.setProperty("dynamicBoost", true);
-        pt.setProperty("propertyIndex", true);
-        root.commit();
+    @Test
+    public void testIndexingDynamicBoostMissingProperty() throws Exception {
+        createAssetsIndexAndProperties(true, false);
 
-        String log = runTest(LuceneDocumentMaker.class, false);
+        String log = runIndexingTest(LuceneDocumentMaker.class, false);
         assertEquals("[]", log);
     }
 
-    private String runTest(Class<?> loggerClass, boolean nameProperty) throws 
CommitFailedException {
-        LogCustomizer customLogs = LogCustomizer
-                .forLogger(loggerClass)
-                .enable(Level.TRACE).create();
+    // verifying fulltext query syntax ability, put here for comparison with 
dynamic boost and dynamic boost lite
+    @Test
+    public void testQueryFullTextWithTitle() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'titleone')]", 
XPATH, Arrays.asList("/test/asset1"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // case insensitive
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'LONG')]", XPATH, 
Arrays.asList("/test/asset1", "/test/asset2"));
+        // wildcard works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'title*')]", 
XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        // space is treated as AND
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
titleone')]", XPATH, Arrays.asList("/test/asset1"));
+        // OR works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long OR 
titleone')]", XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+        // minus works
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'long 
-titleone')]", XPATH, Arrays.asList("/test/asset2"));
+    }
+
+    // Section 2. Query dynamicboost testing
+    @Test
+    public void testQueryDynamicBoostBasic() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertEquals(
+                "[dam:Asset] as [a] /* 
lucene:test-index(/oak:index/test-index) :fulltext:plant " + 
"((jcr:content/metadata/predictedTags/plant:1 
jcr:content/metadata/predictedTags/plant:1)^1.0E-4) ft:(\"plant\")\n" + "  
where contains([a].[*], 'plant') */",
+                explain("//element(*, dam:Asset)[jcr:contains(., 'plant')]", 
XPATH));
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'plant')]", XPATH,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'flower')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    // dynamic boost: query should be case insensitive
+    @Test
+    public void testQueryDynamicBoostCaseInsensitive() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'FLOWER')]", 
XPATH, Arrays.asList("/test/asset1", "/test/asset2"));
+    }
+
+    @Ignore //todo: bug? wildcard doesn't work at all for dynamic boost term
+    @Test
+    public void testQueryDynamicBoostWildcard() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+        assertQuery("//element(*, dam:Asset)[jcr:contains(., 'blu*')]", XPATH, 
Arrays.asList("/test/asset3"));
+    }
+
+    // dynamic boost: should respect confidence as query result order
+    @Test
+    public void testQueryDynamicBoostOrder() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertOrderedQuery("select [jcr:path] from [dam:Asset] where 
contains(*, 'plant')",
+                Arrays.asList("/test/asset2", "/test/asset3", "/test/asset1"));
+    }
+
+    // dynamic boost: space is explained as OR instead of AND which is 
documented as fulltext query in OAK doc todo: should be documented
+    @Test
+    public void testQueryDynamicBoostSpace() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue flower')", SQL2,
+                Arrays.asList("/test/asset1", "/test/asset2", "/test/asset3"));
+    }
+
+    @Test
+    public void testQueryDynamicBoostOr() throws Exception {
+        createAssetsIndexAndProperties(false, false);
+        prepareTestAssets();
+
+        assertQuery("select [jcr:path] from [dam:Asset] where contains(*, 
'blue OR coffee')", SQL2,

Review comment:
       I guess an explicit `AND` would not work here too. This is the expected 
behavior though.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to