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



##########
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:
       make sense, removed it




-- 
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