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 th...@apache.org on 2013/05/13 15:36:31 UTC

svn commit: r1481846 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ test/resources/org/apache/jackrabbit/oak/query/

Author: thomasm
Date: Mon May 13 13:36:30 2013
New Revision: 1481846

URL: http://svn.apache.org/r1481846
Log:
OAK-318 Excerpt support

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ColumnImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
    jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt
    jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java?rev=1481846&r1=1481845&r2=1481846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java Mon May 13 13:36:30 2013
@@ -185,6 +185,15 @@ public class XPathToSQL2Converter {
             } else if (readIf("@")) {
                 Property p = readProperty();
                 columnList.add(p);
+            } else if (readIf("rep:excerpt")) {
+                read("(");
+                if (!readIf(")")) {
+                    // only rep:excerpt(.) and rep:excerpt() are currently supported
+                    read(".");
+                    read(")");
+                }
+                Property p = new Property(currentSelector, "rep:excerpt");
+                columnList.add(p);
             } else if (readIf("(")) {
                 // special case: ".../(@prop)" is actually not a child node, 
                 // but the same node (selector) as before 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ColumnImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ColumnImpl.java?rev=1481846&r1=1481845&r2=1481846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ColumnImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ColumnImpl.java Mon May 13 13:36:30 2013
@@ -58,5 +58,9 @@ public class ColumnImpl extends AstEleme
     public void bindSelector(SourceImpl source) {
         selector = source.getExistingSelector(selectorName);
     }
+    
+    public SelectorImpl getSelector() {
+        return selector;
+    }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1481846&r1=1481845&r2=1481846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java Mon May 13 13:36:30 2013
@@ -198,6 +198,16 @@ public class SelectorImpl extends Source
         if (joinCondition != null) {
             joinCondition.restrict(f);
         }
+        // rep:excerpt handling: create a (fake) restriction
+        // "rep:excerpt is not null" to let the index know that
+        // we will need the excerpt
+        for (ColumnImpl c : query.getColumns()) {
+            if (c.getSelector() == this) {
+                if (c.getColumnName().equals("rep:excerpt")) {
+                    f.restrictProperty("rep:excerpt", Operator.NOT_EQUAL, null);
+                }
+            }
+        }
         
         // all conditions can be pushed to the selectors -
         // except in some cases to "outer joined" selectors,
@@ -257,8 +267,8 @@ public class SelectorImpl extends Source
                 }
             }
         }
-
-        return false; // no matches found
+        // no matches found
+        return false; 
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt?rev=1481846&r1=1481845&r2=1481846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt Mon May 13 13:36:30 2013
@@ -37,6 +37,9 @@ explain select * from [nt:base] as a inn
 explain select * from [nt:base] as a inner join [nt:base] as b on isdescendantnode(b, a) where a.[jcr:uuid] is not null and b.[x] is not null
 [nt:base] as [a] /* property jcr:uuid where [a].[jcr:uuid] is not null */ inner join [nt:base] as [b] /* traverse "/path/from/the/join/selector/*" where [b].[x] is not null */ on isdescendantnode([b], [a])
 
+explain select [rep:excerpt] from [nt:base] where [jcr:uuid] is not null
+[nt:base] as [nt:base] /* property jcr:uuid (rep:excerpt) where [nt:base].[jcr:uuid] is not null */
+
 commit / + "test": { "jcr:uuid": "xyz", "a": { "jcr:uuid": "123" } }
 
 select [jcr:path] from [nt:base] where [jcr:uuid] is not null

Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt?rev=1481846&r1=1481845&r2=1481846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt Mon May 13 13:36:30 2013
@@ -50,22 +50,22 @@ xpath2sql /test
 select [jcr:path], [jcr:score], * from [nt:base] as a where name(a) = 'test' and issamenode(a, '/') /* xpath: /test */
 
 xpath2sql /
-invalid: Query: (*)/; expected: jcr:root, /, *, text, element, @, (, .
+invalid: Query: (*)/; expected: jcr:root, /, *, text, element, @, rep:excerpt, (, .
 
 xpath2sql /[@name='data']
-invalid: Query: /[(*)@name='data']; expected: jcr:root, /, *, text, element, @, (, .
+invalid: Query: /[(*)@name='data']; expected: jcr:root, /, *, text, element, @, rep:excerpt, (, .
 
 xpath2sql //[@name='data']
-invalid: Query: //[(*)@name='data']; expected: *, text, element, @, (, .
+invalid: Query: //[(*)@name='data']; expected: *, text, element, @, rep:excerpt, (, .
 
 xpath2sql //child/[@id='2.1']
-invalid: Query: //child/[(*)@id='2.1']; expected: jcr:root, /, *, text, element, @, (, .
+invalid: Query: //child/[(*)@id='2.1']; expected: jcr:root, /, *, text, element, @, rep:excerpt, (, .
 
 xpath2sql //
-invalid: Query: /(*)/; expected: *, text, element, @, (, .
+invalid: Query: /(*)/; expected: *, text, element, @, rep:excerpt, (, .
 
 xpath2sql [@name='data']
-invalid: Query: [(*)@name='data']; expected: /, *, text, element, @, (, .
+invalid: Query: [(*)@name='data']; expected: /, *, text, element, @, rep:excerpt, (, .
 
 xpath2sql test
 select [jcr:path], [jcr:score], * from [nt:base] as a where issamenode(a, '/test') /* xpath: test */
@@ -146,7 +146,7 @@ select [jcr:path], [jcr:score], * from [
 
 # TODO support rep:excerpt() and rep:similar()? how?
 xpath2sql /jcr:root/testroot/*[jcr:contains(., 'jackrabbit')]/rep:excerpt(.)
-invalid: Query: /jcr:root/testroot/*[jcr:contains(., 'jackrabbit')]/rep:excerpt((*).); expected: <end>
+select b.[jcr:path] as [jcr:path], b.[jcr:score] as [jcr:score], b.[rep:excerpt] as [rep:excerpt] from [nt:base] as a inner join [nt:base] as b on ischildnode(b, a) where contains(a.*, 'jackrabbit') and ischildnode(a, '/testroot') /* xpath: /jcr:root/testroot/*[jcr:contains(., 'jackrabbit')]/rep:excerpt(.) */
 
 xpath2sql //testroot/*[@jcr:primaryType='nt:unstructured' and fn:not(@mytext)]
 select b.[jcr:path] as [jcr:path], b.[jcr:score] as [jcr:score], b.* from [nt:base] as a inner join [nt:base] as b on ischildnode(b, a) where name(a) = 'testroot' and b.[jcr:primaryType] = 'nt:unstructured' and b.[mytext] is null /* xpath: //testroot/*[@jcr:primaryType='nt:unstructured' and fn:not(@mytext)] */
@@ -367,7 +367,7 @@ xpath2sql //element(*, my:type)[jcr:cont
 select [jcr:path], [jcr:score], * from [my:type] as a where contains([my:title], 'jcr') order by score(a) desc /* xpath: //element(*, my:type)[jcr:contains(@my:title, 'jcr')] order by jcr:score() descending */
 
 xpath2sql [invalid/query
-invalid: Query: [(*)invalid/query; expected: /, *, text, element, @, (, .
+invalid: Query: [(*)invalid/query; expected: /, *, text, element, @, rep:excerpt, (, .
 
 xpath2sql //element(*, my:type)[@my:value = -'x']
 invalid: Query: //element(*, my:type)[@my:value = -'x'(*)]