You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2019/09/19 12:02:29 UTC

svn commit: r1867171 - in /jackrabbit/oak/trunk/oak-search/src: main/java/org/apache/jackrabbit/oak/plugins/index/search/util/ test/java/org/apache/jackrabbit/oak/plugins/index/search/util/ test/resources/

Author: tommaso
Date: Thu Sep 19 12:02:29 2019
New Revision: 1867171

URL: http://svn.apache.org/viewvc?rev=1867171&view=rev
Log:
OAK-8637 - added convergence test for LMSEstimator

Added:
    jackrabbit/oak/trunk/oak-search/src/test/resources/
    jackrabbit/oak/trunk/oak-search/src/test/resources/lms-data.tsv
Modified:
    jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimator.java
    jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimatorTest.java

Modified: jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimator.java?rev=1867171&r1=1867170&r2=1867171&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimator.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimator.java Thu Sep 19 12:02:29 2019
@@ -26,7 +26,7 @@ import org.apache.jackrabbit.oak.spi.que
 public class LMSEstimator {
 
     private static final double DEFAULT_ALPHA = 0.03;
-    private static final int DEFAULT_THRESHOLD = 0;
+    private static final int DEFAULT_THRESHOLD = 5;
 
     private double[] weights;
     private final double alpha;
@@ -39,7 +39,7 @@ public class LMSEstimator {
     }
 
     public LMSEstimator() {
-        this(DEFAULT_ALPHA, new double[]{0.1,0.2,0.5,0.2,0.1}, DEFAULT_THRESHOLD);
+        this(DEFAULT_ALPHA, new double[5], DEFAULT_THRESHOLD);
     }
 
     public synchronized void update(Filter filter, long numFound) {

Modified: jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimatorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimatorTest.java?rev=1867171&r1=1867170&r2=1867171&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimatorTest.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/search/util/LMSEstimatorTest.java Thu Sep 19 12:02:29 2019
@@ -16,12 +16,17 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.search.util;
 
-import org.apache.jackrabbit.oak.plugins.index.search.util.LMSEstimator;
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.oak.query.QueryImpl;
+import org.apache.jackrabbit.oak.query.SQL2Parser;
+import org.apache.jackrabbit.oak.query.SQL2ParserTest;
+import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextExpression;
 import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextTerm;
-import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.junit.Test;
 
+import java.util.List;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
@@ -32,6 +37,8 @@ import static org.mockito.Mockito.when;
  */
 public class LMSEstimatorTest {
 
+    private static final SQL2Parser p = SQL2ParserTest.createTestSQL2Parser();
+
     @Test
     public void testUpdate() throws Exception {
         LMSEstimator lmsEstimator = new LMSEstimator();
@@ -76,4 +83,45 @@ public class LMSEstimatorTest {
         long estimate = lmsEstimator.estimate(filter);
         assertEquals(0L, estimate);
     }
+
+    @Test
+    public void testConvergence() throws Exception {
+        LMSEstimator lmsEstimator = new LMSEstimator();
+        long mse = getMSE(lmsEstimator);
+        int epochs = 15;
+        for (int i = 1; i <= epochs; i++) {
+            train(lmsEstimator);
+            long currentMSE = getMSE(lmsEstimator);
+            assertTrue(currentMSE <= mse);
+            mse = currentMSE;
+        }
+    }
+
+    private long getMSE(LMSEstimator lmsEstimator) throws Exception {
+        int n = 0;
+        long mse = 0;
+        for (String line : IOUtils.readLines(getClass().getResourceAsStream("/lms-data.tsv"))) {
+            String[] entries = line.split("\t");
+            long numDocs = Long.parseLong(entries[1]);
+            QueryImpl q = (QueryImpl) p.parse(entries[2]);
+            Filter filter = q.getSource().createFilter(true);
+            long estimate = lmsEstimator.estimate(filter);
+            mse += Math.pow(numDocs - estimate, 2);
+            n++;
+        }
+        mse /= n;
+        return mse;
+    }
+
+    private void train(LMSEstimator lmsEstimator) throws Exception {
+        List<String> strings = IOUtils.readLines(getClass().getResourceAsStream("/lms-data.tsv"));
+        for (String line : strings) {
+            String[] entries = line.split("\t");
+            long numDocs = Long.parseLong(entries[1]);
+            QueryImpl q = (QueryImpl) p.parse(entries[2]);
+            Filter filter = q.getSource().createFilter(true);
+            lmsEstimator.update(filter, numDocs);
+        }
+    }
+
 }
\ No newline at end of file

Added: jackrabbit/oak/trunk/oak-search/src/test/resources/lms-data.tsv
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/test/resources/lms-data.tsv?rev=1867171&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/test/resources/lms-data.tsv (added)
+++ jackrabbit/oak/trunk/oak-search/src/test/resources/lms-data.tsv Thu Sep 19 12:02:29 2019
@@ -0,0 +1,122 @@
+2	2	select [jcr:path], [jcr:score], * from [nt:base] as a where contains([text], 'hello') and isdescendantnode(a, '/') order by score(a) /* xpath: /jcr:root//*[jcr:contains(@text, 'hello')] order by jcr:score() */
+0	1585	select [jcr:path] as [path] from [nt:base] where native('solr', '*:*')
+141	1585	select [jcr:path] as [path] from [nt:base] where native('solr', '*:*')
+272	1585	select [jcr:path] as [path] from [nt:base] where native('solr', '*:*')
+261	2	select [jcr:path] as [path] from [nt:base] where ISCHILDNODE([/testroot]) AND CONTAINS(text, 'hallo')
+44	2	select [jcr:path] as [path] from [nt:base] where contains([node1/text], 'hello') order by [jcr:path]
+86	3	select [jcr:path] as [path] from [nt:base] where contains([node2/text], 'hello OR hallo') order by [jcr:path]
+52	1	select [jcr:path] as [path] from [nt:base] where contains([node1/text], 'hello') and contains([node2/text], 'hallo') order by [jcr:path]
+0	0	select [jcr:path] as [path] from [nt:base] where contains([text], 'hello or hallo') order by [jcr:path]
+1	0	SELECT [rep:spellcheck()] FROM [nt:base] WHERE [jcr:path] = '/' AND SPELLCHECK('helo')
+0	0	select [jcr:path], [jcr:score], [rep:spellcheck()] from [nt:base] as a where spellcheck('helo') and issamenode(a, '/') /* xpath: /jcr:root[rep:spellcheck('helo')]/(rep:spellcheck()) */
+0	1	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(*, 'fox')
+0	1	SELECT * FROM [nt:unstructured] WHERE CONTAINS(*, 'fox')
+0	2	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(*, '''fox juMps'' Test OR otheR')
+0	2	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(*, 'fox jumps')
+0	2	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(*, '''fox jumps'' test OR other')
+2	2	select [jcr:path], [jcr:score], * from [nt:unstructured] as a where contains(*, 'quick fox') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/element(*, nt:unstructured)[jcr:contains(*, 'quick fox')] */
+1	1	select [jcr:path], [jcr:score], * from [nt:unstructured] as a where contains([title], 'quick fox') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/element(*, nt:unstructured)[jcr:contains(@title, 'quick fox')] */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'foo:bar') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'foo:bar')] */
+0	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(*, 'foo:bar')
+0	1	SELECT * FROM [nt:unstructured] WHERE contains(*, 'fox') AND [jcr:path] LIKE '/testroot/%'
+1	8	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu*')] */
+2	8	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu*')
+7	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu*ck') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu*ck')] */
+2	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu*ck')
+2	3	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'quick*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'quick*')] */
+2	3	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'quick*')
+5	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*quick') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*quick')] */
+1	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*quick')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu*Ck') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu*Ck')] */
+1	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu*Ck')
+1	1580	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*o*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*o*')] */
+1044	1580	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*o*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*o*')] */
+1398	1580	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*o*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*o*')] */
+759	1580	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*o*')
+1005	1580	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*o*')
+1177	1580	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*o*')
+2112	5	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*ump*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*ump*')] */
+603	5	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*ump*')
+523	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu**ck') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu**ck')] */
+252	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu**ck')
+98	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'q***u**c*k') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'q***u**c*k')] */
+145	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'q***u**c*k')
+0	5	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*uMp*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*uMp*')] */
+103	5	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*uMp*')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'quic?') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'quic?')] */
+75	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'quic?')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '?uick') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '?uick')] */
+52	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '?uick')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu?ck') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu?ck')] */
+38	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu?ck')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'qu?cK') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'qu?cK')] */
+27	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'qu?cK')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'q??ck') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'q??ck')] */
+19	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'q??ck')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '?uic?') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '?uic?')] */
+15	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '?uic?')
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '??iCk') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '??iCk')] */
+10	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '??iCk')
+0	418	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*ab*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*ab*')] */
+160	418	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*ab*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*ab*')] */
+330	418	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, '*ab*') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, '*ab*')] */
+259	418	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*ab*')
+307	418	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*ab*')
+340	418	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, '*ab*')
+503	0	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'q***j**c*k') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'q***j**c*k')] */
+197	0	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'q***j**c*k')
+95	1	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'text ''fox jumps'' -other')
+0	1	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'text "fox jumps"')
+0	1	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND CONTAINS(title, 'fox jumps')
+0	2	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo') 
+0	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo')
+0	4	 select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo') /* xpath: testroot/*[jcr:contains(@prop1, 'foo') or jcr:contains(@prop2, 'foo') or jcr:contains(@prop3, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo') 
+2	3	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo') /* xpath: testroot/*[jcr:contains(@prop1, 'foo') or jcr:contains(@prop2, 'foo') or jcr:contains(@prop3, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo') 
+9	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') /* xpath: testroot/*[jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo') or jcr:contains(@prop2, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo') 
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') /* xpath: testroot/*[jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo') or jcr:contains(@prop2, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo') 
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') /* xpath: testroot/*[jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo') or jcr:contains(@prop2, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') 
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo') /* xpath: testroot/*[jcr:contains(@prop2, 'foo') or jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') 
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo') /* xpath: testroot/*[jcr:contains(@prop2, 'foo') or jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop2], 'foo') 
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop3], 'foo')
+1	4	select [jcr:path], [jcr:score], * from [nt:base] as a where ischildnode(a, '/testroot') and contains([prop1], 'foo') /* xpath: testroot/*[jcr:contains(@prop2, 'foo') or jcr:contains(@prop3, 'foo') or jcr:contains(@prop1, 'foo')] order by @jcr:score descending */
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'max&moritz') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'max&moritz')] */
+0	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'max&moritz')
+0	1	SELECT * FROM [nt:base] WHERE [nt:base].prop1 IS NOT NULL
+0	1	SELECT * FROM [nt:unstructured] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'fox test')
+2	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, '"three two"') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, '"three two"')]/rep:excerpt(.) */
+1	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'foo') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'foo')]/rep:excerpt(.) */
+1	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, '"two four"') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, '"two four"')]/rep:excerpt(.) */
+1	3	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'ipsu*') and isdescendantnode(a, '/testroot/node1') /* xpath: testroot/node1//*[jcr:contains(*, 'ipsu*')]/rep:excerpt(.) */
+1	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'ipsu*') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'ipsu*')]/rep:excerpt(.) */
+1	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'lorem ipsu*') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'lorem ipsu*')]/rep:excerpt(.) */
+1	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'ipsu* dolor') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'ipsu* dolor')]/rep:excerpt(.) */
+1	4	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'jackrabbit') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'jackrabbit')]/rep:excerpt(.) */
+3	4	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'jackrabbit') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'jackrabbit')]/rep:excerpt(.) */
+3	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, '"five six"') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, '"five six"')]/rep:excerpt(.) */
+2	2	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'apache jackrabbit') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'apache jackrabbit')]/rep:excerpt(.) */
+2	1	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'テスト') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'テスト')]/rep:excerpt(.) */
+1	4	select [jcr:path], [jcr:score], [rep:excerpt] from [nt:base] as a where contains(*, 'jackrabbit') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(*, 'jackrabbit')]/rep:excerpt(.) */
+1	1	SELECT * FROM [nt:unstructured] WHERE ISCHILDNODE([/testroot]) AND CONTAINS(mytext, 'fox')
+0	0	SELECT * FROM [nt:base] as NODE WHERE contains([NODE].[*], 'SQL2NODELOCALNAMETEST')
+0	0	SELECT * FROM [nt:base] as NODE WHERE contains([NODE].[*], 'sql2nodelocalnametest')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'AE502DBEA2C411DEBD340AD156D89593') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'AE502DBEA2C411DEBD340AD156D89593')] */
+0	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'AE502DBEA2C411DEBD340AD156D89593')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains(*, 'quick brown fox') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(*, 'quick brown fox')] */
+0	1	SELECT * FROM [nt:base] WHERE [jcr:path] LIKE '/testroot/%' AND contains(*, 'quick brown fox')
+1	1	select [jcr:path], [jcr:score], * from [nt:base] as a where contains([jcr:content/*], 'lazy') and ischildnode(a, '/testroot') /* xpath: testroot/*[jcr:contains(jcr:content, 'lazy')] */
\ No newline at end of file