svn commit: r1303334 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ test/java/org/apache/jackrabbit/oak/query/
Author: thomasm Date: Wed Mar 21 09:53:10 2012 New Revision: 1303334 URL: http://svn.apache.org/viewvc?rev=1303334view=rev Log: OAK-28 Query implementation (bind variables) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1303334r1=130r2=1303334view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Mar 21 09:53:10 2012 @@ -182,6 +182,7 @@ public class Query { @Override public boolean visit(SelectorImpl node) { +selectors.add(node); node.setQuery(query); return true; } @@ -284,18 +285,15 @@ public class Query { for (int i = 0, size = orderings.length; i size; i++) { Value a = orderValues[i]; Value b = orderValues2[i]; -// TODO order by: currently use string compare -String as = a == null ? null : a.getString(); -String bs = b == null ? null : b.getString(); -if (as == null || bs == null) { -if (as == bs) { +if (a == null || b == null) { +if (a == b) { comp = 0; -} else if (as == null) { +} else if (a == null) { // TODO order by: nulls first, last, low or high? comp = 1; } } else { -comp = as.compareTo(bs); +comp = a.compareTo(b); } if (comp != 0) { if (orderings[i].isDescending()) { @@ -430,4 +428,12 @@ public class Query { return offset; } +public Value getBindVariableValue(String bindVariableName) { +Value v = bindVariableMap.get(bindVariableName); +if (v == null) { +throw new RuntimeException(Bind variable value not set: + bindVariableName); +} +return v; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java?rev=1303334r1=130r2=1303334view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java Wed Mar 21 09:53:10 2012 @@ -40,7 +40,7 @@ public class QueryEngine { return new QueryEngine(mk); } -public IteratorRow executeQuery(String language, String query, MapString, String bindings) throws ParseException { +public IteratorRow executeQuery(String language, String query, MapString, Value bindings) throws ParseException { Query q; if (SQL2.equals(language)) { q = parserSQL2.parse(query); @@ -53,8 +53,8 @@ public class QueryEngine { } q.setMicroKernel(mk); if (bindings != null) { -for (EntryString, String e : bindings.entrySet()) { -q.bindValue(e.getKey(), vf.createValue(e.getValue())); +for (EntryString, Value e : bindings.entrySet()) { +q.bindValue(e.getKey(), e.getValue()); } } return q.executeQuery(mk.getHeadRevision()); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java?rev=1303334r1=130r2=1303334view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java Wed Mar 21 09:53:10 2012 @@ -34,7 +34,7 @@ public class Row implements ComparableR
svn commit: r1303863 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query: ScalarFactory.java ScalarImpl.java ScalarType.java
Author: thomasm Date: Thu Mar 22 16:04:27 2012 New Revision: 1303863 URL: http://svn.apache.org/viewvc?rev=1303863view=rev Log: OAK-33 Values in oak-core (within the query engine) Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarFactory.java - copied, changed from r1302981, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ValueFactory.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarImpl.java - copied, changed from r1303394, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Value.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarType.java - copied, changed from r1302981, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/PropertyType.java Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarFactory.java (from r1302981, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ValueFactory.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarFactory.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarFactory.javap1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ValueFactory.javar1=1302981r2=1303863rev=1303863view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ValueFactory.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarFactory.java Thu Mar 22 16:04:27 2012 @@ -18,30 +18,30 @@ package org.apache.jackrabbit.oak.query; import java.math.BigDecimal; -public class ValueFactory { +public class ScalarFactory { -public Value createValue(String value) { -return new Value(value, PropertyType.STRING); +public ScalarImpl createValue(String value) { +return new ScalarImpl(value, ScalarType.STRING); } -public Value createValue(BigDecimal value) { -return new Value(value, PropertyType.DECIMAL); +public ScalarImpl createValue(BigDecimal value) { +return new ScalarImpl(value, ScalarType.DECIMAL); } -public Value createValue(double value) { -return new Value(value, PropertyType.DOUBLE); +public ScalarImpl createValue(double value) { +return new ScalarImpl(value, ScalarType.DOUBLE); } -public Value createValue(long value) { -return new Value(value, PropertyType.DECIMAL); +public ScalarImpl createValue(long value) { +return new ScalarImpl(value, ScalarType.LONG); } -public Value createValue(boolean value) { -return new Value(value, PropertyType.BOOLEAN); +public ScalarImpl createValue(boolean value) { +return new ScalarImpl(value, ScalarType.BOOLEAN); } -public Value createValue(String value, int type) { -return new Value(value, type); +public ScalarImpl createValue(String value, int type) { +return new ScalarImpl(value, type); } } Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarImpl.java (from r1303394, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Value.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarImpl.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarImpl.javap1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Value.javar1=1303394r2=1303863rev=1303863view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Value.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ScalarImpl.java Thu Mar 22 16:04:27 2012 @@ -16,17 +16,14 @@ */ package org.apache.jackrabbit.oak.query; -import java.io.InputStream; import java.math.BigDecimal; -import org.apache.jackrabbit.oak.api.Scalar; - -public class Value implements Scalar, ComparableValue { +public class ScalarImpl implements ComparableScalarImpl { private final Object value; private final int type; -public Value(Object value, int type) { +public ScalarImpl(Object value, int type) { this.value = value; this.type = type; } @@ -64,10 +61,6 @@ public class Value implements Scalar, Co return value.toString(); } -public InputStream getInputStream() { -throw new UnsupportedOperationException(); // TODO -} - public String getDate() { // TODO convert? return value.toString(); @@ -83,15 +76,15 @@ public class Value implements Scalar, Co
svn commit: r1325270 - /jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java
Author: thomasm Date: Thu Apr 12 14:08:56 2012 New Revision: 1325270 URL: http://svn.apache.org/viewvc?rev=1325270view=rev Log: OAK-58 connection leak in test case OAK-60 occasional test case failure DbBlobStoreTest#testGarbageCollection Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java?rev=1325270r1=1325269r2=1325270view=diff == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java Thu Apr 12 14:08:56 2012 @@ -44,10 +44,11 @@ public class DbBlobStoreTest extends Tes protected AbstractBlobStore store; private Connection sentinel; +private JdbcConnectionPool cp; public void setUp() throws Exception { Class.forName(org.h2.Driver); -JdbcConnectionPool cp = JdbcConnectionPool.create(jdbc:h2:mem:, , ); +cp = JdbcConnectionPool.create(jdbc:h2:mem:, , ); sentinel = cp.getConnection(); DbBlobStore blobStore = new DbBlobStore(); blobStore.setConnectionPool(cp); @@ -61,6 +62,7 @@ public class DbBlobStoreTest extends Tes sentinel.close(); } store.close(); +cp.dispose(); } public void testAddFile() throws Exception { @@ -213,10 +215,11 @@ public class DbBlobStoreTest extends Tes store.clearCache(); // https://issues.apache.org/jira/browse/OAK-60 +// endure there is at least one old entry (with age 1 ms) try { Thread.sleep(1); } catch (InterruptedException e) { - +// ignore } store.startMark();
svn commit: r1325841 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt
Author: thomasm Date: Fri Apr 13 16:53:28 2012 New Revision: 1325841 URL: http://svn.apache.org/viewvc?rev=1325841view=rev Log: OAK-36 Implement a query parser (XPath to SQL-2 converter) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.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=1325841r1=1325840r2=1325841view=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 Fri Apr 13 16:53:28 2012 @@ -56,6 +56,10 @@ public class XPathToSQL2Converter { * @throws ParseException if parsing fails */ public String convert(String query) throws ParseException { +// TODO verify this is correct +if (!query.startsWith(/)) { +query = /jcr:root/ + query; +} initialize(query); expected = new ArrayListString(); read(); @@ -126,15 +130,10 @@ public class XPathToSQL2Converter { } if (path.isEmpty()) { // no condition -} else if (path.equals(%)) { -// ignore } else { if (descendants) { -Function f1 = new Function(issamenode); -f1.params.add(Literal.newString(path)); -Function f2 = new Function(isdescendantnode); -f2.params.add(Literal.newString(path)); -Condition c = new Condition(f1, or, f2); +Function c = new Function(isdescendantnode); +c.params.add(Literal.newString(path)); condition = add(condition, c); } else if (children) { Function f = new Function(ischildnode); Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt?rev=1325841r1=1325840r2=1325841view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt (original) +++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Fri Apr 13 16:53:28 2012 @@ -3,53 +3,71 @@ # * lines starting with xpath are xpath queries, followed by expected sql2 query # * use ascii character only -xpath /jcr:root//*[jcr:contains(., 'test')] order by @jcr:score -select * from [nt:base] where contains(*, 'test') and (issamenode('/') or isdescendantnode('/')) order by [jcr:score] +xpath //*[@name='Hello'] +select * from [nt:base] where [name] = 'Hello' -xpath /jcr:root//element(*, test) -select * from [test] where issamenode('/') or isdescendantnode('/') +xpath /jcr:root//*[@name='Hello'] +select * from [nt:base] where ([name] = 'Hello') and isdescendantnode('/') + +xpath content/* +select * from [nt:base] where ischildnode('/content') + +xpath content//* +select * from [nt:base] where isdescendantnode('/content') + +xpath content//*[@name='Hello'] +select * from [nt:base] where ([name] = 'Hello') and isdescendantnode('/content') + +xpath /jcr:root/content//*[@name='Hello'] +select * from [nt:base] where ([name] = 'Hello') and isdescendantnode('/content') + +xpath //*[jcr:contains(., 'test')] order by @jcr:score +select * from [nt:base] where contains(*, 'test') order by [jcr:score] + +xpath /jcr:root//*[jcr:contains(., 'test')] order by @jcr:score +select * from [nt:base] where contains(*, 'test') and isdescendantnode('/') order by [jcr:score] xpath /jcr:root//element(*, test) -select * from [test] where issamenode('/') or isdescendantnode('/') +select * from [test] where isdescendantnode('/') xpath /jcr:root//element(*, user)[test/@jcr:primaryType] -select * from [user] where ([test/jcr:primaryType] is not null) and (issamenode('/') or isdescendantnode('/')) +select * from [user] where ([test/jcr:primaryType] is not null) and isdescendantnode('/') xpath /jcr:root/content//*[(@sling:resourceType = 'start')] -select * from [nt:base] where ([sling:resourceType] = 'start') and (issamenode('/content') or isdescendantnode('/content')) +select * from [nt:base] where ([sling:resourceType] = 'start') and isdescendantnode('/content') xpath /jcr:root/content//*[(@sling:resourceType = 'page')] -select * from [nt:base] where ([sling:resourceType] = 'page') and (issamenode
svn commit: r1329600 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java
Author: thomasm Date: Tue Apr 24 09:05:24 2012 New Revision: 1329600 URL: http://svn.apache.org/viewvc?rev=1329600view=rev Log: OAK-70 MicroKernelInputStream test and optimization Added: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java?rev=1329600r1=1329599r2=1329600view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/MicroKernelInputStream.java Tue Apr 24 09:05:24 2012 @@ -17,19 +17,20 @@ package org.apache.jackrabbit.mk.util; import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.mk.util.IOUtils; import java.io.IOException; import java.io.InputStream; /** - * An input stream to simplify reading a blob from the micro kernel. - * See also BlobStoreInputStream. + * An input stream to simplify reading a blob from a {@code MicroKernel}. */ public class MicroKernelInputStream extends InputStream { private final MicroKernel mk; private final String id; private long pos; +private long length = -1; private byte[] oneByteBuff; public MicroKernelInputStream(MicroKernel mk, String id) { @@ -37,6 +38,20 @@ public class MicroKernelInputStream exte this.id = id; } +@Override +public long skip(long n) { +if (n 0) { +return 0; +} +if (length == -1) { +length = mk.getLength(id); +} +n = Math.min(n, length - pos); +pos += n; +return n; +} + +@Override public int read(byte[] b, int off, int len) { int l = mk.read(id, pos, b, off, len); if (l 0) { @@ -46,6 +61,7 @@ public class MicroKernelInputStream exte return l; } +@Override public int read() throws IOException { if (oneByteBuff == null) { oneByteBuff = new byte[1]; Added: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java?rev=1329600view=auto == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java (added) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java Tue Apr 24 09:05:24 2012 @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law + * or agreed to in writing, software distributed under the License is + * distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.apache.jackrabbit.mk.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Random; +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.mk.core.MicroKernelImpl; +import org.junit.Test; + +/** + * Tests the {@code MicroKernelInputStream}. + */ +public class MicroKernelInputStreamTest { + +MicroKernel mk = new MicroKernelImpl(); + +@Test +public void small() throws IOException { +doTest(10, 10); +} + +@Test +public void medium() throws IOException { +doTest(1000, 10); +} + +@Test +public void large() throws IOException { +doTest(10, 1); +} + +private void doTest(int maxLength, int count) throws IOException { +String[] s = new String[count * 2]; +Random r = new Random(0); +for (int i = 0; i s.length;) { +int len = count == 1 ? maxLength : r.nextInt(maxLength); +byte[] data
svn commit: r1329667 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ main/java/org/apache/jackrabbit/oak/api/ main/java/org/apache/jackrabbit/oak/core/ main/java/org
Author: thomasm Date: Tue Apr 24 12:17:27 2012 New Revision: 1329667 URL: http://svn.apache.org/viewvc?rev=1329667view=rev Log: OAK-28 Query implementation (index provider, property index) Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/QueryIndexProvider.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/KernelContentRepository.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/Filter.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/QueryIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java?rev=1329667r1=1329666r2=1329667view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java Tue Apr 24 12:17:27 2012 @@ -288,4 +288,8 @@ public class BTree { return minSize + minSize + 1; } +boolean isUnique() { +return unique; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java?rev=1329667r1=1329666r2=1329667view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java Tue Apr 24 12:17:27 2012 @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.mk.index; +import java.util.Iterator; import org.apache.jackrabbit.mk.simple.NodeImpl; /** @@ -51,4 +52,21 @@ public interface Index { void addOrRemoveProperty(String nodePath, String propertyName, String value, boolean add); +/** + * Get an iterator over the paths for the given value. For unique + * indexes, the iterator will contain at most one element. + * + * @param value the value, or null to return all indexed rows + * @param revision the revision + * @return an iterator of the paths (an empty iterator if not found) + */ +IteratorString getPaths(String value, String revision); + +/** + * Whether each value may only appear once in the index. + * + * @return true if unique + */ +boolean isUnique(); + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1329667r1=1329666r2=1329667view=diff
svn commit: r1330854 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit: mk/index/Indexer.java oak/api/QueryEngine.java oak/core/ContentRepositoryImpl.java oak/query/QueryEngineIm
Author: thomasm Date: Thu Apr 26 13:52:25 2012 New Revision: 1330854 URL: http://svn.apache.org/viewvc?rev=1330854view=rev Log: OAK-28 Query implementation (simplify index provider) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/QueryIndexProvider.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1330854r1=1330853r2=1330854view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Thu Apr 26 13:52:25 2012 @@ -31,6 +31,7 @@ import org.apache.jackrabbit.oak.query.i import org.apache.jackrabbit.oak.query.index.QueryIndexProvider; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -52,7 +53,6 @@ public class Indexer implements QueryInd private HashMapString, BTreePage modified = new HashMapString, BTreePage(); private SimpleLRUCacheString, BTreePage cache = SimpleLRUCache.newInstance(100); private String readRevision; -private ArrayListQueryIndexListener listeners = new ArrayListQueryIndexListener(); public Indexer(MicroKernel mk, String indexRootNode) { this.mk = mk; @@ -115,9 +115,6 @@ public class Indexer implements QueryInd return existing; } buildAndAddIndex(index); -for (QueryIndexListener l : listeners) { -l.added(new PropertyContentIndex(mk, index)); -} return index; } @@ -324,7 +321,7 @@ public class Indexer implements QueryInd public void updateIndex(String rootPath, JsopReader t, String lastRevision) { while (true) { int r = t.read(); -if (r == JsopTokenizer.END) { +if (r == JsopReader.END) { break; } String path = PathUtils.concat(rootPath, t.readString()); @@ -361,7 +358,7 @@ public class Indexer implements QueryInd case '^': { removeProperty(path, lastRevision); t.read(':'); -if (t.matches(JsopTokenizer.NULL)) { +if (t.matches(JsopReader.NULL)) { // ignore } else { String value = t.readRawValue().trim(); @@ -508,7 +505,11 @@ public class Indexer implements QueryInd } } -public ListQueryIndex getQueryIndexes() { +@Override +public ListQueryIndex getQueryIndexes(MicroKernel mk) { +if (mk != this.mk) { +return Collections.emptyList(); +} ArrayListQueryIndex list = new ArrayListQueryIndex(); for (Index index : indexes.values()) { QueryIndex qi = null; @@ -522,14 +523,4 @@ public class Indexer implements QueryInd return list; } -@Override -public void addListener(QueryIndexListener listener) { -listeners.add(listener); -} - -@Override -public void removeListener(QueryIndexListener listener) { -listeners.remove(listener); -} - } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java?rev=1330854r1=1330853r2=1330854view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Thu Apr 26 13:52:25 2012 @@ -53,9 +53,4 @@ public interface QueryEngine { */ Result executeQuery(String statement, String language, MapString, CoreValue bindings) throws ParseException; -/** - * Close the query engine. - */ -void close(); - } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1330854r1=1330853r2=1330854view=diff
svn commit: r1330887 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/core/ main/java/org/apache/jackrabbit/oak/osgi/ test/java/org/apache/jackrabbit/oak/plugins/name/
Author: thomasm Date: Thu Apr 26 14:47:47 2012 New Revision: 1330887 URL: http://svn.apache.org/viewvc?rev=1330887view=rev Log: OAK-28 Query implementation (make index provider osgiable) Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/name/NamespaceMappingsTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1330887r1=1330886r2=1330887view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Thu Apr 26 14:47:47 2012 @@ -62,11 +62,14 @@ public class ContentRepositoryImpl imple this(new MicroKernelImpl()); } -public ContentRepositoryImpl(MicroKernel mk) { +private ContentRepositoryImpl(MicroKernel mk) { +this(mk, new Indexer(mk)); +} + +public ContentRepositoryImpl(MicroKernel mk, QueryIndexProvider indexProvider) { microKernel = mk; valueFactory = new CoreValueFactoryImpl(microKernel); nodeStore = new KernelNodeStore(microKernel, valueFactory); -QueryIndexProvider indexProvider = new Indexer(mk); queryEngine = new QueryEngineImpl(microKernel, valueFactory, indexProvider); // FIXME: workspace setup must be done elsewhere... Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java?rev=1330887r1=1330886r2=1330887view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java Thu Apr 26 14:47:47 2012 @@ -36,6 +36,8 @@ public class Activator implements Bundle private ServiceTracker tracker; +private OsgiIndexProvider indexProvider; + private final MapServiceReference, ServiceRegistration services = new HashMapServiceReference, ServiceRegistration(); @@ -47,11 +49,14 @@ public class Activator implements Bundle tracker = new ServiceTracker( context, MicroKernel.class.getName(), this); tracker.open(); +indexProvider = new OsgiIndexProvider(); +indexProvider.start(bundleContext); } @Override public void stop(BundleContext bundleContext) throws Exception { -tracker.open(); +tracker.close(); +indexProvider.stop(); } //--- ServiceTrackerCustomizer --- @@ -63,7 +68,7 @@ public class Activator implements Bundle MicroKernel kernel = (MicroKernel) service; services.put(reference, context.registerService( ContentRepository.class.getName(), -new ContentRepositoryImpl(kernel), +new ContentRepositoryImpl(kernel, indexProvider), new Properties())); return service; } else { @@ -74,11 +79,12 @@ public class Activator implements Bundle @Override public void modifiedService(ServiceReference reference, Object service) { +// nothing to do } @Override public void removedService(ServiceReference reference, Object service) { -ServiceRegistration registration = services.get(reference); +ServiceRegistration registration = services.remove(reference); registration.unregister(); context.ungetService(reference); } Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java?rev=1330887view=auto == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java Thu Apr 26 14:47:47 2012 @@ -0,0 +1,76 @@ +package org.apache.jackrabbit.oak.osgi; + +import
svn commit: r1333504 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ main/java/org/apache/jackrabbit/oak/api/ main/java/org/apache/jackrabbit/oak/core/ main/java/org
Author: thomasm Date: Thu May 3 15:29:42 2012 New Revision: 1333504 URL: http://svn.apache.org/viewvc?rev=1333504view=rev Log: OAK-28 Query implementation (removed QueryIndexProvider.init(); and implementation) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1333504r1=1333503r2=1333504view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Thu May 3 15:29:42 2012 @@ -29,13 +29,13 @@ import org.apache.jackrabbit.mk.util.Exc import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.mk.wrapper.MicroKernelWrapper; import org.apache.jackrabbit.mk.wrapper.MicroKernelWrapperBase; +import org.apache.jackrabbit.oak.spi.QueryIndexProvider; /** * The index mechanism, as a wrapper. */ public class IndexWrapper extends MicroKernelWrapperBase implements MicroKernel { -private static final String INDEX_PATH = /index; private static final String TYPE_PREFIX = prefix:; private static final String TYPE_PROPERTY = property:; private static final String UNIQUE = unique; @@ -48,10 +48,14 @@ public class IndexWrapper extends MicroK public IndexWrapper(MicroKernel mk) { this.mk = MicroKernelWrapperBase.wrap(mk); -this.indexer = new Indexer(mk); +this.indexer = new Indexer(this, mk, Indexer.INDEX_CONFIG_ROOT); indexer.init(); } +public QueryIndexProvider getIndexer() { +return indexer; +} + @Override public String getHeadRevision() { return mk.getHeadRevision(); @@ -64,6 +68,10 @@ public class IndexWrapper extends MicroK @Override public boolean nodeExists(String path, String revisionId) { +String indexRoot = indexer.getIndexRootNode(); +if (path.startsWith(indexRoot)) { +return false; +} return mk.nodeExists(path, revisionId); } @@ -99,7 +107,8 @@ public class IndexWrapper extends MicroK @Override public String commitStream(String rootPath, JsopReader jsonDiff, String revisionId, String message) { -if (!rootPath.startsWith(INDEX_PATH)) { +String indexRoot = indexer.getIndexRootNode(); +if (!rootPath.startsWith(indexRoot)) { String rev = mk.commitStream(rootPath, jsonDiff, revisionId, message); jsonDiff.resetReader(); indexer.updateIndex(rootPath, jsonDiff, rev); @@ -125,7 +134,7 @@ public class IndexWrapper extends MicroK t.read('{'); // parse but ignore NodeImpl.parse(map, t, 0); -path = PathUtils.relativize(INDEX_PATH, path); +path = PathUtils.relativize(indexRoot, path); if (path.startsWith(TYPE_PREFIX)) { String prefix = path.substring(TYPE_PREFIX.length
svn commit: r1333911 - in /jackrabbit/oak/trunk/oak-mk: pom.xml src/main/java/org/apache/jackrabbit/mk/osgi/Activator.java src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.java
Author: thomasm Date: Fri May 4 12:37:04 2012 New Revision: 1333911 URL: http://svn.apache.org/viewvc?rev=1333911view=rev Log: OAK-67 OSGi Bundle Setup - add an OSGi service for (in-memory and persisted) MicroKernel instances Added: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.java - copied, changed from r1333794, jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/Activator.java Removed: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/Activator.java Modified: jackrabbit/oak/trunk/oak-mk/pom.xml Modified: jackrabbit/oak/trunk/oak-mk/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/pom.xml?rev=1333911r1=1333910r2=1333911view=diff == --- jackrabbit/oak/trunk/oak-mk/pom.xml (original) +++ jackrabbit/oak/trunk/oak-mk/pom.xml Fri May 4 12:37:04 2012 @@ -47,12 +47,22 @@ org.apache.jackrabbit.mk.client, org.apache.jackrabbit.mk.blobs /Export-Package -Bundle-Activator - org.apache.jackrabbit.mk.osgi.Activator -/Bundle-Activator /instructions /configuration /plugin + plugin +groupIdorg.apache.felix/groupId +artifactIdmaven-scr-plugin/artifactId +version1.7.2/version +executions + execution +idgenerate-scr-scrdescriptor/id +goals + goalscr/goal +/goals + /execution +/executions + /plugin /plugins pluginManagement plugins @@ -78,10 +88,22 @@ optionaltrue/optional /dependency dependency + groupIdorg.osgi/groupId + artifactIdorg.osgi.compendium/artifactId + scopeprovided/scope + optionaltrue/optional +/dependency +dependency groupIdbiz.aQute/groupId artifactIdbndlib/artifactId scopeprovided/scope /dependency +dependency +groupIdorg.apache.felix/groupId +artifactIdorg.apache.felix.scr.annotations/artifactId +scopeprovided/scope +/dependency + !-- commons dependency -- dependency Copied: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.java (from r1333794, jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/Activator.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.java?p2=jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.javap1=jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/Activator.javar1=1333794r2=1333911rev=1333911view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/Activator.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/osgi/MicroKernelService.java Fri May 4 12:37:04 2012 @@ -16,31 +16,44 @@ */ package org.apache.jackrabbit.mk.osgi; -import java.util.Properties; - +import org.osgi.service.component.ComponentContext; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Service; +import org.apache.felix.scr.annotations.Activate; import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.core.MicroKernelImpl; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; -public class Activator implements BundleActivator { +@Component +@Service(MicroKernel.class) +public class MicroKernelService extends MicroKernelImpl { + +@Property(description=The unique name of this instance) +public static final String NAME = name; -private ServiceRegistration registration; +@Property(description=The home directory (in-memory if not set)) +public static final String HOME_DIR = homeDir; -//- BundleActivator -- +private String name; @Override -public void start(BundleContext context) throws Exception { -registration = context.registerService( -MicroKernel.class.getName(), -new MicroKernelImpl(), -new Properties()); +public String toString() { +return name; } -@Override -public void stop(BundleContext context) throws Exception { -registration.unregister(); +@Activate +public void activate(ComponentContext context) { +Object homeDir = context.getProperties().get(HOME_DIR); +name = + context.getProperties().get(NAME); +if (homeDir != null
svn commit: r1335513 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
Author: thomasm Date: Tue May 8 13:39:01 2012 New Revision: 1335513 URL: http://svn.apache.org/viewvc?rev=1335513view=rev Log: OAK-15 Clean up oak-jcr Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1335513r1=1335512r2=1335513view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Tue May 8 13:39:01 2012 @@ -108,7 +108,7 @@ public class SessionImpl extends Abstrac @Override public Node getNodeByIdentifier(String id) throws RepositoryException { ensureIsAlive(); - +// TODO following line throws IndexOutOfBoundsException if id is empty if (id.charAt(0) == '/') { return getNode(id); } else { @@ -253,7 +253,7 @@ public class SessionImpl extends Abstrac } // private --- - + /** * Ensure that this session is alive and throw an exception otherwise. *
svn commit: r1336717 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ oak-core/src/main/java/org/apache/jackrab
Author: thomasm Date: Thu May 10 14:30:40 2012 New Revision: 1336717 URL: http://svn.apache.org/viewvc?rev=1336717view=rev Log: OAK-34 Define query API - support workspaces and access rights in queries Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java?rev=1336717r1=1336716r2=1336717view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Thu May 10 14:30:40 2012 @@ -49,12 +49,13 @@ public interface QueryEngine { * * @param statement the query statement * @param language the language + * @param session the content session to use * @param bindings the bind variable value bindings * @return the result * @throws ParseException if the statement could not be parsed * @throws IllegalArgumentException if there was an error executing the query */ -Result executeQuery(String statement, String language, MapString, CoreValue bindings) throws ParseException; +Result executeQuery(String statement, String language, ContentSession session, MapString, CoreValue bindings) throws ParseException; // TODO pass namespace mapping // TODO pass node type information (select * from [xyz] is supposed to return at least the mandatory columns for xyz) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1336717r1=1336716r2=1336717view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Thu May 10 14:30:40 2012 @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.CoreValue; import org.apache.jackrabbit.oak.api.CoreValueFactory; import org.apache.jackrabbit.oak.query.ast.AstVisitorBase; @@ -69,6 +70,7 @@ public class Query { private long offset; private boolean prepared; private final CoreValueFactory valueFactory; +private ContentSession session; Query(SourceImpl source, ConstraintImpl constraint, OrderingImpl[] orderings, ColumnImpl[] columns, CoreValueFactory valueFactory) { @@ -461,6 +463,10 @@ public class Query { return new ArrayListString(bindVariableMap.keySet()); } +public String getWorkspaceName() { +return session.getWorkspaceName(); +} + public void setQueryEngine(QueryEngineImpl queryEngine) { this.queryEngine = queryEngine; } @@ -469,4 +475,8 @@ public class Query { return queryEngine.getBestIndex(filter); } +public void setSession(ContentSession session) { +this.session = session; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1336717r1=1336716r2=1336717view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query
svn commit: r1336718 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java
Author: thomasm Date: Thu May 10 14:33:29 2012 New Revision: 1336718 URL: http://svn.apache.org/viewvc?rev=1336718view=rev Log: OAK-16 Proper ValueFactory implementation and Value handling (toString, reduce noise) Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java?rev=1336718r1=1336717r2=1336718view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java Thu May 10 14:33:29 2012 @@ -37,7 +37,7 @@ import java.util.Calendar; import java.util.TimeZone; /** - * ValueImpl... + * The implementation of JCR values. */ class ValueImpl implements Value { @@ -48,7 +48,7 @@ class ValueImpl implements Value { private final CoreValue value; private final NamePathMapper namePathMapper; - + private InputStream stream = null; /** @@ -67,17 +67,12 @@ class ValueImpl implements Value { } //-- Value --- -/** - * @see javax.jcr.Value#getType() - */ + @Override public int getType() { return value.getType(); } -/** - * @see javax.jcr.Value#getBoolean() - */ @Override public boolean getBoolean() throws RepositoryException { if (getType() == PropertyType.STRING || getType() == PropertyType.BINARY || getType() == PropertyType.BOOLEAN) { @@ -87,9 +82,6 @@ class ValueImpl implements Value { } } -/** - * @see javax.jcr.Value#getDate() - */ @Override public Calendar getDate() throws RepositoryException { Calendar cal; @@ -109,9 +101,6 @@ class ValueImpl implements Value { return cal; } -/** - * @see javax.jcr.Value#getDecimal() - */ @Override public BigDecimal getDecimal() throws RepositoryException { try { @@ -127,9 +116,6 @@ class ValueImpl implements Value { } } -/** - * @see javax.jcr.Value#getDouble() - */ @Override public double getDouble() throws RepositoryException { try { @@ -145,9 +131,6 @@ class ValueImpl implements Value { } } -/** - * @see javax.jcr.Value#getLong() - */ @Override public long getLong() throws RepositoryException { try { @@ -163,9 +146,6 @@ class ValueImpl implements Value { } } -/** - * @see javax.jcr.Value#getString() - */ @Override public String getString() throws RepositoryException { switch (getType()) { @@ -187,10 +167,6 @@ class ValueImpl implements Value { } } - -/** - * @see javax.jcr.Value#getStream() - */ @Override public InputStream getStream() throws IllegalStateException, RepositoryException { if (stream == null) { @@ -207,22 +183,17 @@ class ValueImpl implements Value { stream = value.getNewStream(); } } - + return stream; } -/** - * @see javax.jcr.Value#getBinary() - */ @Override public Binary getBinary() throws RepositoryException { return new BinaryImpl(this); } //- Object --- -/** - * @see Object#equals(Object) - */ + @Override public boolean equals(Object obj) { if (obj instanceof ValueImpl) { @@ -232,11 +203,14 @@ class ValueImpl implements Value { } } -/** - * @see Object#hashCode() - */ -@Override + @Override public int hashCode() { return value.hashCode(); } + +@Override +public String toString() { +return value.toString(); +} + } \ No newline at end of file
svn commit: r1338599 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/Query.java main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java test/java/org/a
Author: thomasm Date: Tue May 15 08:47:06 2012 New Revision: 1338599 URL: http://svn.apache.org/viewvc?rev=1338599view=rev Log: OAK-28 Query implementation (support parsing and evaluating fulltext search conditions) Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FullTextTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1338599r1=1338598r2=1338599view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Tue May 15 08:47:06 2012 @@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.query.a import org.apache.jackrabbit.oak.query.ast.DescendantNodeImpl; import org.apache.jackrabbit.oak.query.ast.DescendantNodeJoinConditionImpl; import org.apache.jackrabbit.oak.query.ast.EquiJoinConditionImpl; +import org.apache.jackrabbit.oak.query.ast.FullTextSearchImpl; import org.apache.jackrabbit.oak.query.ast.FullTextSearchScoreImpl; import org.apache.jackrabbit.oak.query.ast.LengthImpl; import org.apache.jackrabbit.oak.query.ast.LiteralImpl; @@ -136,8 +137,16 @@ public class Query { } @Override +public boolean visit(FullTextSearchImpl node) { +node.setQuery(query); +node.bindSelector(source); +return true; +} + +@Override public boolean visit(FullTextSearchScoreImpl node) { node.setQuery(query); +node.bindSelector(source); return true; } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java?rev=1338599r1=1338598r2=1338599view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java Tue May 15 08:47:06 2012 @@ -18,6 +18,10 @@ */ package org.apache.jackrabbit.oak.query.ast; +import java.text.ParseException; +import java.util.ArrayList; +import org.apache.jackrabbit.mk.simple.NodeImpl; +import org.apache.jackrabbit.oak.api.CoreValue; import org.apache.jackrabbit.oak.query.index.FilterImpl; public class FullTextSearchImpl extends ConstraintImpl { @@ -25,6 +29,8 @@ public class FullTextSearchImpl extends private final String selectorName; private final String propertyName; private final StaticOperandImpl fullTextSearchExpression; +private SelectorImpl selector; +private FullTextExpression expr; public FullTextSearchImpl(String selectorName, String propertyName, StaticOperandImpl fullTextSearchExpression) { @@ -68,15 +74,229 @@ public class FullTextSearchImpl extends return builder.toString(); } +private boolean evaluateContains(CoreValue value) { +String v = value.getString(); +return expr.evaluate(v); +} + @Override public boolean evaluate() { -// TODO support evaluating fulltext conditions +if (propertyName != null) { +CoreValue v = selector.currentProperty(propertyName); +if (v == null) { +return false; +} +return evaluateContains(v); +} +NodeImpl n = selector.currentNode(); +for (int i = 0; i n.getPropertyCount(); i++) { +String p = n.getProperty(i); +if (p == null) { +break; +} +CoreValue v = selector.currentProperty(p); +if (evaluateContains(v)) { +return true; +} +} return false; } +public void bindSelector(SourceImpl source) { +selector = source.getSelector(selectorName); +if (selector == null) { +throw new IllegalArgumentException(Unknown selector: + selectorName); +} +CoreValue v = fullTextSearchExpression.currentValue(); +try { +expr = FullTextParser.parse(v.getString()); +} catch (ParseException e) { +throw new IllegalArgumentException(Invalid expression: + fullTextSearchExpression, e
svn commit: r1340908 - in /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit: mk/fs/ mk/server/ oak/util/
Author: thomasm Date: Mon May 21 07:13:47 2012 New Revision: 1340908 URL: http://svn.apache.org/viewvc?rev=1340908view=rev Log: OAK-13 Cleanup org.apache.jackrabbit.mk (remove empty directories) Removed: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/fs/ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/server/ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/
svn commit: r1341503 - /jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Author: thomasm Date: Tue May 22 14:50:13 2012 New Revision: 1341503 URL: http://svn.apache.org/viewvc?rev=1341503view=rev Log: OAK-16 Proper ValueFactory implementation and Value handling - don't call Value.getStream() and then Value.getString() in a test, as this is not allowed Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1341503r1=1341502r2=1341503view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Tue May 22 14:50:13 2012 @@ -1719,8 +1719,11 @@ public class RepositoryTest extends Abst assertTrue(session2.propertyExists(propertyPath)); Value value2 = session2.getProperty(propertyPath).getValue(); assertEquals(value.getType(), value2.getType()); -assertEqualStream(value.getStream(), value2.getStream()); -assertEquals(value.getString(), value2.getString()); +if (value.getType() == PropertyType.BINARY) { +assertEqualStream(value.getStream(), value2.getStream()); +} else { +assertEquals(value.getString(), value2.getString()); +} if (value2.getType() == PropertyType.REFERENCE || value2.getType() == PropertyType.WEAKREFERENCE) { String ref = value2.getString();
svn commit: r1341505 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/ oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-core/src/main/java/org/apache/jackra
Author: thomasm Date: Tue May 22 14:58:07 2012 New Revision: 1341505 URL: http://svn.apache.org/viewvc?rev=1341505view=rev Log: OAK-28 Query implementation - implement missing features Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java 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/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/RowImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java?rev=1341505r1=1341504r2=1341505view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Tue May 22 14:58:07 2012 @@ -50,12 +50,15 @@ public interface QueryEngine { * @param statement the query statement * @param language the language * @param session the content session to use + * @param limit the maximum result set size + * @param offset the number of rows to skip * @param bindings the bind variable value bindings * @return the result * @throws ParseException if the statement could not be parsed * @throws IllegalArgumentException if there was an error executing the query */ -Result executeQuery(String statement, String language, ContentSession session, MapString, CoreValue bindings) throws ParseException; +Result executeQuery(String statement, String language, ContentSession session, +long limit, long offset, MapString, CoreValue bindings) throws ParseException; // TODO pass namespace mapping // TODO pass node type information (select * from [xyz] is supposed to return at least the mandatory columns for xyz) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueImpl.java?rev=1341505r1=1341504r2=1341505view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueImpl.java Tue May 22 14:58:07 2012 @@ -17,12 +17,14 @@ package org.apache.jackrabbit.oak.kernel; import org.apache.jackrabbit.oak.api.CoreValue; +import org.apache.jackrabbit.util.ISO8601; import javax.jcr.PropertyType; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.util.Calendar; /** * {@code CoreValueImpl} is the default implementation of the {@code CoreValue} @@ -304,6 +306,10 @@ class CoreValueImpl implements CoreValue return ((BigDecimal) value).compareTo(o.getDecimal()); case PropertyType.BOOLEAN: return ((Boolean) value).compareTo(o.getBoolean()); +case PropertyType.DATE: +Calendar d1 = ISO8601.parse(getString()); +Calendar d2 = ISO8601.parse(o.getString()); +return d1.compareTo(d2); default: return value.toString().compareTo(o.toString
svn commit: r1344746 - /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
Author: thomasm Date: Thu May 31 14:34:20 2012 New Revision: 1344746 URL: http://svn.apache.org/viewvc?rev=1344746view=rev Log: OAK-120 MicroKernel API: specific retention policy of binaries Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java?rev=1344746r1=1344745r2=1344746view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java Thu May 31 14:34:20 2012 @@ -19,7 +19,7 @@ package org.apache.jackrabbit.mk.api; import java.io.InputStream; /** - * The MicroKernel bdesign goals/principles/b: + * The MicroKernel bDesign Goals and Principles/b: * ul * limanage huge trees of nodes and properties efficiently/li * liMVCC-based concurrency control @@ -32,8 +32,9 @@ import java.io.InputStream; * liintegrated API for efficiently storing/retrieving large binaries/li * lihuman-readable data serialization (JSON)/li * /ul - * p/ + * p * The MicroKernel bData Model/b: + * /p * ul * lisimple JSON-inspired data model: just nodes and properties/li * lia node consists of an unordered set of name -gt; item mappings. each @@ -43,7 +44,27 @@ import java.io.InputStream; * lisupported property types: string, number, boolean, array/li * lia property value is stored and used as an opaque, unparsed character sequence/li * /ul + * p + * The bRetention Policy for Revisions/b: + * p * TODO specify retention policy for old revisions, i.e. minimal guaranteed retention period (OAK-114) + * /p + * p + * The bRetention Policy for Binaries/b: + * /p + * p + * The MicroKernel implementation is free to remove binaries if both of the + * following conditions are met: + * /p + * ul + * liIf the binary is not references as a property value of the + * format :blobId:lt;blobIdgt; where lt;blobIdgt; is the id returned by + * {@link write(InputStream in)}. This includes simple property values such as + * {bin: :blobId:1234} as well as array property values such as + * {array: [:blobId:1234, :blobId:5678]}./li + * liIf the binary was stored before the last retained revision (this is to + * keep temporary binaries, and binaries that are not yet referenced)./li + * /ul */ public interface MicroKernel {
svn commit: r1344748 - /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java
Author: thomasm Date: Thu May 31 14:36:06 2012 New Revision: 1344748 URL: http://svn.apache.org/viewvc?rev=1344748view=rev Log: Remove unused code. Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java?rev=1344748r1=1344747r2=1344748view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/fs/FilePathDisk.java Thu May 31 14:36:06 2012 @@ -299,24 +299,6 @@ public class FilePathDisk extends FilePa return in; } -/** - * Call the garbage collection and run finalization. This close all files that - * were not closed, and are no longer referenced. - */ -static void freeMemoryAndFinalize() { -Runtime rt = Runtime.getRuntime(); -long mem = rt.freeMemory(); -for (int i = 0; i 16; i++) { -rt.gc(); -long now = rt.freeMemory(); -rt.runFinalization(); -if (now == mem) { -break; -} -mem = now; -} -} - @Override public FileChannel open(String mode) throws IOException { return new FileDisk(name, mode);
svn commit: r1344750 - in /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs: AbstractBlobStore.java DbBlobStore.java FileBlobStore.java
Author: thomasm Date: Thu May 31 14:41:56 2012 New Revision: 1344750 URL: http://svn.apache.org/viewvc?rev=1344750view=rev Log: OAK-123 Data store improvements Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/DbBlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1344750r1=1344749r2=1344750view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Thu May 31 14:41:56 2012 @@ -392,6 +392,9 @@ public abstract class AbstractBlobStore if (this == other) { return true; } +if (other == null || !(other instanceof BlockId)) { +return false; +} BlockId o = (BlockId) other; return Arrays.equals(digest, o.digest) pos == o.pos; Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/DbBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/DbBlobStore.java?rev=1344750r1=1344749r2=1344750view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/DbBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/DbBlobStore.java Thu May 31 14:41:56 2012 @@ -43,6 +43,7 @@ public class DbBlobStore extends Abstrac (id varchar primary key, level int, lastMod bigint)); stat.execute(create table if not exists datastore_data + (id varchar primary key, data binary)); +stat.close(); conn.close(); } @@ -154,6 +155,7 @@ public class DbBlobStore extends Abstrac prep.setString(2, id); prep.setLong(3, minLastModified); prep.executeUpdate(); +prep.close(); } finally { conn.close(); } @@ -183,6 +185,8 @@ public class DbBlobStore extends Abstrac prepData.execute(); count++; } +prepData.close(); +prep.close(); } finally { conn.close(); } Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java?rev=1344750r1=1344749r2=1344750view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java Thu May 31 14:41:56 2012 @@ -40,6 +40,8 @@ public class FileBlobStore extends Abstr private final byte[] buffer = new byte[16 * 1024]; private boolean mark; +// TODO file operations are not secure (return values not checked, no retry,...) + public FileBlobStore(String dir) throws IOException { baseDir = new File(dir); baseDir.mkdirs();
svn commit: r1344752 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/api/ main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ test/ja
Author: thomasm Date: Thu May 31 14:43:30 2012 New Revision: 1344752 URL: http://svn.apache.org/viewvc?rev=1344752view=rev Log: OAK-28 Query implementation Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java 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/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java?rev=1344752r1=1344751r2=1344752view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Thu May 31 14:43:30 2012 @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.api; import java.text.ParseException; import java.util.List; import java.util.Map; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; /** * The query engine allows to parse and execute queries. @@ -53,12 +54,14 @@ public interface QueryEngine { * @param limit the maximum result set size * @param offset the number of rows to skip * @param bindings the bind variable value bindings + * @param namePathMapper the name and path mapper to use * @return the result * @throws ParseException if the statement could not be parsed * @throws IllegalArgumentException if there was an error executing the query */ Result executeQuery(String statement, String language, ContentSession session, -long limit, long offset, MapString, CoreValue bindings) throws ParseException; +long limit, long offset, MapString, CoreValue bindings, +NamePathMapper namePathMapper) throws ParseException; // TODO pass namespace mapping // TODO pass node type information (select * from [xyz] is supposed to return at least the mandatory columns for xyz) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1344752r1=1344751r2=1344752view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Thu May 31 14:43:30 2012 @@ -23,6 +23,7 @@ import org.apache.jackrabbit.mk.api.Micr import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.CoreValue; import org.apache.jackrabbit.oak.api.CoreValueFactory; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.query.ast.AstVisitorBase; import org.apache.jackrabbit.oak.query.ast.BindVariableValueImpl; import org.apache.jackrabbit.oak.query.ast.ChildNodeImpl; @@ -73,6 +74,7 @@ public class Query { private boolean prepared; private final CoreValueFactory valueFactory; private ContentSession session; +private NamePathMapper namePathMapper; Query(SourceImpl source, ConstraintImpl constraint, OrderingImpl[] orderings, ColumnImpl[] columns, CoreValueFactory valueFactory) { @@ -496,4 +498,12 @@ public class Query { this.session = session; } +public void setNamePathMapper(NamePathMapper namePathMapper) { +this.namePathMapper = namePathMapper; +} + +public NamePathMapper getNamePathMapper() { +return namePathMapper; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1344752r1=1344751r2=1344752view=diff
svn commit: r1344753 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: SessionDelegate.java query/QueryManagerImpl.java query/qom/QueryObjectModelImpl.java
Author: thomasm Date: Thu May 31 14:44:09 2012 New Revision: 1344753 URL: http://svn.apache.org/viewvc?rev=1344753view=rev Log: OAK-28 Query implementation Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java?rev=1344753r1=1344752r2=1344753view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java Thu May 31 14:44:09 2012 @@ -362,7 +362,7 @@ public class SessionDelegate { .createValue(id)); Result result = getQueryEngine().executeQuery(SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id, Query.JCR_SQL2, -getContentSession(), Long.MAX_VALUE, 0, bindings); +getContentSession(), Long.MAX_VALUE, 0, bindings, namePathMapper); String path = null; Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java?rev=1344753r1=1344752r2=1344753view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Thu May 31 14:44:09 2012 @@ -39,6 +39,7 @@ import org.apache.jackrabbit.oak.api.Que import org.apache.jackrabbit.oak.api.Result; import org.apache.jackrabbit.oak.jcr.SessionDelegate; import org.apache.jackrabbit.oak.jcr.query.qom.QueryObjectModelFactoryImpl; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; /** * The implementation of the corresponding JCR interface. @@ -105,7 +106,8 @@ public class QueryManagerImpl implements try { HashMapString, CoreValue bindMap = convertMap(bindVariableMap); ContentSession s = sessionDelegate.getContentSession(); -Result r = queryEngine.executeQuery(statement, language, s, limit, offset, bindMap); +NamePathMapper namePathMapper = sessionDelegate.getNamePathMapper(); +Result r = queryEngine.executeQuery(statement, language, s, limit, offset, bindMap, namePathMapper); return new QueryResultImpl(sessionDelegate, r); } catch (IllegalArgumentException e) { throw new InvalidQueryException(e); Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java?rev=1344753r1=1344752r2=1344753view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java Thu May 31 14:44:09 2012 @@ -185,7 +185,7 @@ public class QueryObjectModelImpl implem @Override public Node storeAsNode(String absPath) throws RepositoryException { -Node n = queryManager.createQuery(getStatement(), Query.JCR_SQL2). +Node n = queryManager.createQuery(getStatement(), Query.JCR_JQOM). storeAsNode(absPath); storedQueryPath = n.getPath(); return n;
svn commit: r1344754 - /jackrabbit/oak/trunk/oak-it/jcr/pom.xml
Author: thomasm Date: Thu May 31 14:45:17 2012 New Revision: 1344754 URL: http://svn.apache.org/viewvc?rev=1344754view=rev Log: OAK-6 update test exclusions Modified: jackrabbit/oak/trunk/oak-it/jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-it/jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/jcr/pom.xml?rev=1344754r1=1344753r2=1344754view=diff == --- jackrabbit/oak/trunk/oak-it/jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-it/jcr/pom.xml Thu May 31 14:45:17 2012 @@ -86,13 +86,10 @@ org.apache.jackrabbit.test.api.nodetype. org.apache.jackrabbit.test.api.nodetype.CanRemoveItemTest org.apache.jackrabbit.test.api.LifecycleTest org.apache.jackrabbit.test.api.query.GetPropertyNamesTest#testGetPropertyNames -org.apache.jackrabbit.test.api.query.OrderByMultiTypeTest#testMultipleOrder org.apache.jackrabbit.test.api.query.SaveTest#testConstraintViolationException org.apache.jackrabbit.test.api.query.SimpleSelectionTest#testSingleProperty org.apache.jackrabbit.test.api.query.XPathQueryLevel2Test#testMultiValueSearch org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType -org.apache.jackrabbit.test.api.query.qom.GetQueryTest#testGetQuery -org.apache.jackrabbit.test.api.query.qom.NodeNameTest#testURILiteral org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType org.apache.jackrabbit.test.api.util org.apache.jackrabbit.test.api.observation
svn commit: r1346301 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt
Author: thomasm Date: Tue Jun 5 08:58:34 2012 New Revision: 1346301 URL: http://svn.apache.org/viewvc?rev=1346301view=rev Log: OAK-28 Query implementation - support explain for XPath queries Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.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=1346301r1=1346300r2=1346301view=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 Tue Jun 5 08:58:34 2012 @@ -57,6 +57,10 @@ public class XPathToSQL2Converter { */ public String convert(String query) throws ParseException { // TODO verify this is correct +boolean explain = query.startsWith(explain ); +if (explain) { +query = query.substring(explain .length()); +} if (!query.startsWith(/)) { query = /jcr:root/ + query; } @@ -196,7 +200,11 @@ public class XPathToSQL2Converter { if (!currentToken.isEmpty()) { throw getSyntaxError(end); } -StringBuilder buff = new StringBuilder(select ); +StringBuilder buff = new StringBuilder(); +if (explain) { +buff.append(explain ); +} +buff.append(select ); buff.append([jcr:path], [jcr:score], ); if (columnList.isEmpty()) { buff.append('*'); Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt?rev=1346301r1=1346300r2=1346301view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt (original) +++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Tue Jun 5 08:58:34 2012 @@ -36,6 +36,9 @@ select [jcr:path], [jcr:score], * from [ xpath /jcr:root/test/text() select [jcr:path], [jcr:score], * from [nt:base] where issamenode('/test/jcr:xmltext') +xpath explain //*[@*='x'] +explain select [jcr:path], [jcr:score], * from [nt:base] where [*] = 'x' + xpath //*[@*='x'] select [jcr:path], [jcr:score], * from [nt:base] where [*] = 'x'
svn commit: r1346307 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
Author: thomasm Date: Tue Jun 5 09:23:39 2012 New Revision: 1346307 URL: http://svn.apache.org/viewvc?rev=1346307view=rev Log: OAK-28 Query implementation - support explain, simplify filtering Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java?rev=1346307r1=1346306r2=1346307view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Tue Jun 5 09:23:39 2012 @@ -66,6 +66,17 @@ public class QueryResultImpl implements return result.getSelectorNames(); } +boolean includeRow(String path) { +if (path == null) { +// a row without path (explain,...) +return true; +} else if (PathUtils.isAncestor(pathFilter, path)) { +// a row within this workspace +return true; +} +return false; +} + @Override public RowIterator getRows() throws RepositoryException { IteratorRowImpl it = new IteratorRowImpl() { @@ -83,7 +94,7 @@ public class QueryResultImpl implements ResultRow r = it.next(); for (String s : getSelectorNames()) { String path = r.getPath(s); -if (PathUtils.isAncestor(pathFilter, path)) { +if (includeRow(path)) { current = new RowImpl(QueryResultImpl.this, r); return; } @@ -145,7 +156,7 @@ public class QueryResultImpl implements while(it.hasNext()) { ResultRow r = it.next(); String path = r.getPath(); -if (PathUtils.isAncestor(pathFilter, path)) { +if (includeRow(path)) { current = getNode(getLocalPath(path)); break; }
svn commit: r1346402 - in /jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons: ArrayUtils.java PathUtils.java
Author: thomasm Date: Tue Jun 5 14:48:40 2012 New Revision: 1346402 URL: http://svn.apache.org/viewvc?rev=1346402view=rev Log: OAK-77: Consolidate Utilities - remove unused code, cleanup Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/ArrayUtils.java jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/ArrayUtils.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/ArrayUtils.java?rev=1346402r1=1346401r2=1346402view=diff == --- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/ArrayUtils.java (original) +++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/ArrayUtils.java Tue Jun 5 14:48:40 2012 @@ -31,6 +31,7 @@ public class ArrayUtils { public static final int[] EMPTY_INTEGER_ARRAY = new int[0]; private ArrayUtils() { +// utility class } /** Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java?rev=1346402r1=1346401r2=1346402view=diff == --- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java (original) +++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java Tue Jun 5 14:48:40 2012 @@ -17,7 +17,6 @@ package org.apache.jackrabbit.oak.commons; import javax.annotation.Nonnull; -import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; @@ -30,7 +29,6 @@ import java.util.NoSuchElementException; * the the result of this method is undefined. */ public class PathUtils { -private static final String[] EMPTY_ARRAY = new String[0]; private PathUtils() { // utility class
svn commit: r1347648 - in /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast: JsopArray.java JsopObject.java JsopObjectTest.java
Author: thomasm Date: Thu Jun 7 14:45:26 2012 New Revision: 1347648 URL: http://svn.apache.org/viewvc?rev=1347648view=rev Log: OAK-19 JSON utilities (code cleanup) Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObjectTest.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java?rev=1347648r1=1347647r2=1347648view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java Thu Jun 7 14:45:26 2012 @@ -100,6 +100,7 @@ public class JsopArray extends Jsop impl return list.size(); } +@Override public String toString() { if (jsop == null) { JsopBuilder w = new JsopBuilder(); Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java?rev=1347648r1=1347647r2=1347648view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java Thu Jun 7 14:45:26 2012 @@ -136,6 +136,7 @@ public class JsopObject extends Jsop imp jsop = null; } +@Override public String toString() { if (jsop == null) { JsopBuilder w = new JsopBuilder(); Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObjectTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObjectTest.java?rev=1347648r1=1347647r2=1347648view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObjectTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObjectTest.java Thu Jun 7 14:45:26 2012 @@ -103,7 +103,7 @@ public class JsopObjectTest extends Test // expected } String s = ; -for(Object o : a) { +for (Object o : a) { s += o + ;; } assertEquals(1;null;Hello;[];{};, s);
svn commit: r1347985 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ main/java/org/apache/jackrabbit/oak/query/index/ test/java/org/apache/jackrabbit/mk/index/ test/
Author: thomasm Date: Fri Jun 8 09:49:56 2012 New Revision: 1347985 URL: http://svn.apache.org/viewvc?rev=1347985view=rev Log: OAK-137 Query: content index (improved robustness, moved code away from the index wrapper to the indexer, don't use a colon in the node name for JCR compatibility) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Index.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java?rev=1347985r1=1347984r2=1347985view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java Fri Jun 8 09:49:56 2012 @@ -129,7 +129,7 @@ public class BTree { JsopBuilder jsop = new JsopBuilder(); path = PathUtils.concat(name, path); jsop.tag('^').key(PathUtils.concat(path, propertyName)); -if (data.length == 0) { +if (data == null) { jsop.value(null); } else { jsop.array(); @@ -208,7 +208,6 @@ public class BTree { break; } } -commit(); return true; } @@ -240,8 +239,6 @@ public class BTree { // other node now) n = parent; } -// subsequent operations are based on the new structure -commit(); } if (n instanceof BTreeNode) { BTreeNode page = (BTreeNode) n; @@ -269,11 +266,6 @@ public class BTree { break; } } -commit(); -} - -void commit() { -indexer.commit(); } String getName() { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java?rev=1347985r1=1347984r2=1347985view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java Fri Jun 8 09:49:56 2012 @@ -29,6 +29,7 @@ class BTreeLeaf extends BTreePage { BTreeLeaf(BTree tree, BTreeNode parent, String name, String[] data, String[] paths) { super(tree, parent, name, data, paths); +verify(); } BTreeLeaf nextLeaf() { @@ -56,22 +57,27 @@ class BTreeLeaf extends BTreePage { tree.modified(this); keys = ArrayUtils.arrayInsert(keys, pos, key); values = ArrayUtils.arrayInsert(values, pos, value); +verify(); } void delete(int pos) { tree.modified(this); keys = ArrayUtils.arrayRemove(keys, pos); values = ArrayUtils.arrayRemove(values, pos); +verify(); } void writeData() { +verify(); tree.modified(this); +tree.bufferSetArray(getPath(), children, null); tree.bufferSetArray(getPath(), keys, keys); tree.bufferSetArray(getPath(), values, values); } @Override void writeCreate
svn commit: r1347991 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java
Author: thomasm Date: Fri Jun 8 09:55:42 2012 New Revision: 1347991 URL: http://svn.apache.org/viewvc?rev=1347991view=rev Log: OAK-126 remove unused code Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java?rev=1347991r1=1347990r2=1347991view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java Fri Jun 8 09:55:42 2012 @@ -264,10 +264,6 @@ public class LogWrapper implements Micro log(// + quote(result)); } -private void logResult() { -// ignored -} - private void log(String message) { if (DEBUG) { System.out.println(message);
svn commit: r1349882 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ test/java/org/apache/jackrabbit/mk/index/
Author: thomasm Date: Wed Jun 13 14:42:22 2012 New Revision: 1349882 URL: http://svn.apache.org/viewvc?rev=1349882view=rev Log: OAK-137 Query: content index (simplify the API a bit) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1349882r1=1349881r2=1349882view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Wed Jun 13 14:42:22 2012 @@ -39,7 +39,7 @@ public class IndexWrapper extends MicroK public IndexWrapper(MicroKernel mk) { this.mk = MicroKernelWrapperBase.wrap(mk); -this.indexer = new Indexer(this, mk, Indexer.INDEX_CONFIG_ROOT); +this.indexer = new Indexer(mk); indexer.init(); } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1349882r1=1349881r2=1349882view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Wed Jun 13 14:42:22 2012 @@ -17,6 +17,7 @@ package org.apache.jackrabbit.mk.index; import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.mk.api.MicroKernelException; import org.apache.jackrabbit.mk.json.JsopBuilder; import org.apache.jackrabbit.mk.json.JsopReader; import org.apache.jackrabbit.mk.json.JsopTokenizer; @@ -30,7 +31,6 @@ import org.apache.jackrabbit.oak.spi.Que import org.apache.jackrabbit.oak.spi.QueryIndexProvider; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -63,9 +63,8 @@ public class Indexer implements QueryInd private static final boolean DISABLED = Boolean.getBoolean(mk.indexDisabled); private MicroKernel mk; -private MicroKernel mkWrapper; private String revision; -private String indexRootNode; +private String indexRootNode = INDEX_CONFIG_ROOT; private int indexRootNodeDepth; private StringBuilder buffer; private ArrayListQueryIndex queryIndexList; @@ -89,18 +88,25 @@ public class Indexer implements QueryInd */ private final HashMapString, PropertyIndex propertyIndexes = new HashMapString, PropertyIndex(); -public Indexer(MicroKernel mkWrapper, MicroKernel mk, String indexRootNode) { -this.mkWrapper = mkWrapper; -if (mkWrapper instanceof IndexWrapper) { -this.mk = ((IndexWrapper) mkWrapper).getBaseKernel(); -} else { -this.mk = mk; -} -this.indexRootNode = indexRootNode; +Indexer(MicroKernel mk) { +this.mk = mk; } -public Indexer(MicroKernel mk) { -this(mk, mk, INDEX_CONFIG_ROOT); +/** + * Get the indexer for the given MicroKernel. This will either create a new instance, + * or (if the MicroKernel is an IndexWrapper), return the existing indexer. + * + * @param mk the MicroKernel instance + * @return an indexer + */ +public static Indexer getInstance(MicroKernel mk) { +if (mk instanceof IndexWrapper) { +Indexer indexer = ((IndexWrapper) mk).getIndexer(); +if (indexer != null) { +return indexer; +} +} +return new Indexer(mk); } public String getIndexRootNode() { @@ -371,7 +377,18 @@ public class Indexer implements QueryInd JsopBuilder jsop = new JsopBuilder(); jsop.tag('^').key(rev).value(readRevision); buffer(jsop.toString()); -commitChanges(); +try { +commitChanges(); +} catch (MicroKernelException e) { +if (!mk.nodeExists(indexRootNode, revision)) { +// the index node itself was removed, which is +// unexpected but possible - re-create it +init = false; +init
svn commit: r1349886 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/core/ main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ main/j
Author: thomasm Date: Wed Jun 13 14:43:56 2012 New Revision: 1349886 URL: http://svn.apache.org/viewvc?rev=1349886view=rev Log: OAK-34 Define query API (simplify the Cursor interface; use the oak-core Tree implementation) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/Cursor.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1349886r1=1349885r2=1349886view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Wed Jun 13 14:43:56 2012 @@ -71,6 +71,7 @@ public class ContentRepositoryImpl imple */ public ContentRepositoryImpl() { this(new MicroKernelImpl(), null, null); +// this(new IndexWrapper(new MicroKernelImpl()), null, null); } /** @@ -79,6 +80,7 @@ public class ContentRepositoryImpl imple * * @param microKernel underlying kernel instance * @param indexProvider index provider + * @param validatorProvider the validation provider */ public ContentRepositoryImpl(MicroKernel microKernel, QueryIndexProvider indexProvider, ValidatorProvider validatorProvider) { @@ -112,7 +114,7 @@ public class ContentRepositoryImpl imple } private static QueryIndexProvider getDefaultIndexProvider(MicroKernel mk) { -return new Indexer(mk); +return Indexer.getInstance(mk); } @Nonnull Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1349886r1=1349885r2=1349886view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Jun 13 14:43:56 2012 @@ -23,6 +23,7 @@ import org.apache.jackrabbit.mk.api.Micr import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.CoreValue; import org.apache.jackrabbit.oak.api.CoreValueFactory; +import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.query.ast.AstVisitorBase; import org.apache.jackrabbit.oak.query.ast.BindVariableValueImpl; @@ -506,4 +507,8 @@ public class Query { return namePathMapper; } +public Tree getTree(String path) { +return session.getCurrentRoot().getTree(path); +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java?rev=1349886r1=1349885r2=1349886view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java Wed Jun 13 14:43:56 2012 @@ -22,6 +22,7 @@ import org.apache.jackrabbit.mk.json.Jso import org.apache.jackrabbit.mk.json.JsopTokenizer; import
svn commit: r1358172 - in /jackrabbit/oak/trunk/oak-jcr: ./ src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ src/test/java/org/apache/jackrabbit/oak/jcr/query/
Author: thomasm Date: Fri Jul 6 12:51:10 2012 New Revision: 1358172 URL: http://svn.apache.org/viewvc?rev=1358172view=rev Log: OAK-155 Query: limited support for the deprecated JCR 1.0 query language Query.SQL Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ColumnImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/Operator.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/OrderingImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMNode.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/SelectorImpl.java jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1358172r1=1358171r2=1358172view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Fri Jul 6 12:51:10 2012 @@ -82,7 +82,6 @@ org.apache.jackrabbit.test.api.Lifecycle org.apache.jackrabbit.test.api.query.GetPropertyNamesTest#testGetPropertyNames org.apache.jackrabbit.test.api.query.SaveTest#testConstraintViolationException org.apache.jackrabbit.test.api.query.SimpleSelectionTest#testSingleProperty -org.apache.jackrabbit.test.api.query.XPathQueryLevel2Test#testMultiValueSearch org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType org.apache.jackrabbit.test.api.util Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ColumnImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ColumnImpl.java?rev=1358172r1=1358171r2=1358172view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ColumnImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/ColumnImpl.java Fri Jul 6 12:51:10 2012 @@ -53,9 +53,8 @@ public class ColumnImpl extends QOMNode if (propertyName != null) { return getSelectorName() + '.' + getPropertyName() + AS [ + columnName + ]; -} else { -return getSelectorName() + .*; } +return getSelectorName() + .*; } } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/Operator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/Operator.java?rev=1358172r1=1358171r2=1358172view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/Operator.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/Operator.java Fri Jul 6 12:51:10 2012 @@ -97,9 +97,8 @@ public enum Operator { public String formatXpath(String a, String b) { if (this == LIKE) { return jcr:like( + a + , + b + ')'; -} else { -return a + ' ' + xpath + ' ' + b; } +return a + ' ' + xpath + ' ' + b; } /** Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/OrderingImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/OrderingImpl.java?rev=1358172r1=1358171r2=1358172view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/OrderingImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/OrderingImpl.java Fri Jul 6 12:51:10 2012 @@ -47,9 +47,8 @@ public class OrderingImpl extends QOMNod public String toString() { if (order == Order.ASCENDING) { return operand + ASC; -} else { -return operand + DESC; } +return operand + DESC; } } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMNode.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMNode.java?rev=1358172r1=1358171r2=1358172view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak
svn commit: r1360570 - /jackrabbit/oak/trunk/oak-core/src/main/resources/org/
Author: thomasm Date: Thu Jul 12 08:02:04 2012 New Revision: 1360570 URL: http://svn.apache.org/viewvc?rev=1360570view=rev Log: OAK-57 Cleanup o.a.j.mk from oak-core (remove empty directory) Removed: jackrabbit/oak/trunk/oak-core/src/main/resources/org/
svn commit: r1360591 - /jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Author: thomasm Date: Thu Jul 12 09:11:38 2012 New Revision: 1360591 URL: http://svn.apache.org/viewvc?rev=1360591view=rev Log: OAK-179 Tests should not fail if there is a jcr:system node Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1360591r1=1360590r2=1360591view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Thu Jul 12 09:11:38 2012 @@ -223,9 +223,13 @@ public class RepositoryTest extends Abst root.getNode(bar).remove(); // transiently removed and... root.addNode(bar); // ... added again NodeIterator nodes = root.getNodes(); -assertEquals(3, nodes.getSize()); +int expected = 3 + (root.hasNode(jcr:system) ? 1 : 0); +assertEquals(expected, nodes.getSize()); while (nodes.hasNext()) { -assertTrue(nodeNames.remove(nodes.nextNode().getName())); + String name = nodes.nextNode().getName(); + if (!name.equals(jcr:system)) { + assertTrue(nodeNames.remove(name)); + } } assertTrue(nodeNames.isEmpty()); @@ -1491,29 +1495,34 @@ public class RepositoryTest extends Abst while (events.hasNext()) { Event event = events.nextEvent(); try { +String path = event.getPath(); +if (path.startsWith(/jcr:system)) { + // ignore changes in jcr:system + continue; +} switch (event.getType()) { case Event.NODE_ADDED: -if (!addNodes.remove(event.getPath())) { +if (!addNodes.remove(path)) { failedEvents.add(event); } break; case Event.NODE_REMOVED: -if (!removeNodes.remove(event.getPath())) { +if (!removeNodes.remove(path)) { failedEvents.add(event); } break; case Event.PROPERTY_ADDED: -if (!addProperties.remove(event.getPath())) { +if (!addProperties.remove(path)) { failedEvents.add(event); } break; case Event.PROPERTY_CHANGED: -if (!setProperties.remove(event.getPath())) { +if (!setProperties.remove(path)) { failedEvents.add(event); } break; case Event.PROPERTY_REMOVED: -if (!removeProperties.remove(event.getPath())) { +if (!removeProperties.remove(path)) { failedEvents.add(event); } break; @@ -1584,24 +1593,29 @@ public class RepositoryTest extends Abst while (events.hasNext()) { Event event = events.nextEvent(); try { +String path = event.getPath(); +if (path.startsWith(/jcr:system)) { + // ignore changes in jcr:system + continue; +} switch (event.getType()) { case Event.NODE_ADDED: -if (!addNodes.remove(event.getPath())) { +if (!addNodes.remove(path)) { failedEvents.add(event); } break; case Event.NODE_REMOVED
svn commit: r1361938 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ test/java/org/apache/jackrabbit/mk/index/ test/resources/org/apache/jackrabbit/oak/query/
Author: thomasm Date: Mon Jul 16 08:46:48 2012 New Revision: 1361938 URL: http://svn.apache.org/viewvc?rev=1361938view=rev Log: OAK-181 Observation / indexing: don't create events for index updates - store the index content in a child node Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java?rev=1361938r1=1361937r2=1361938view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTree.java Mon Jul 16 08:46:48 2012 @@ -37,11 +37,7 @@ public class BTree { this.indexer = indexer; this.name = name; this.unique = unique; -if (!indexer.nodeExists(name)) { -JsopBuilder jsop = new JsopBuilder(); -jsop.tag('+').key(name).object().endObject(); -indexer.commit(jsop.toString()); -} +indexer.createNodes(PathUtils.concat(name, Indexer.INDEX_CONTENT)); } public void setMinSize(int minSize) { @@ -127,7 +123,7 @@ public class BTree { void bufferSetArray(String path, String propertyName, String[] data) { JsopBuilder jsop = new JsopBuilder(); -path = PathUtils.concat(name, path); +path = PathUtils.concat(name, Indexer.INDEX_CONTENT, path); jsop.tag('^').key(PathUtils.concat(path, propertyName)); if (data == null) { jsop.value(null); @@ -151,7 +147,7 @@ public class BTree { void bufferDelete(String path) { JsopBuilder jsop = new JsopBuilder(); -jsop.tag('-').value(PathUtils.concat(name, path)); +jsop.tag('-').value(PathUtils.concat(name, Indexer.INDEX_CONTENT, path)); jsop.newline(); indexer.buffer(jsop.toString()); } @@ -164,7 +160,7 @@ public class BTree { indexer.modified(this, page, false); } -public void moveCache(String oldPath) { +void moveCache(String oldPath) { indexer.moveCache(this, oldPath); } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java?rev=1361938r1=1361937r2=1361938view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java Mon Jul 16 08:46:48 2012 @@ -79,8 +79,20 @@ class BTreeLeaf extends BTreePage { void writeCreate() { verify(); tree.modified(this); +tree.buffer(getJsop()); +} + +private void verify() { +if (values.length != keys.length) { +throw new IllegalArgumentException( +Number of values doesn't match number of keys: + +Arrays.toString(values) + + Arrays.toString(keys)); +} +} + +private String getJsop() { JsopBuilder jsop = new JsopBuilder(); -jsop.tag('+').key(PathUtils.concat(tree.getName(), getPath())).object(); +jsop.tag('+').key(PathUtils.concat(tree.getName(), Indexer.INDEX_CONTENT, getPath())).object(); jsop.key(keys).array(); for (String k : keys) { jsop.value(k); @@ -93,15 +105,12 @@ class BTreeLeaf extends BTreePage { jsop.endArray(); jsop.endObject(); jsop.newline(); -tree.buffer(jsop.toString()); +return jsop.toString(); } -void verify() { -if (values.length != keys.length) { -throw new IllegalArgumentException( -Number
svn commit: r1364616 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/blobs/ test/java/org/apache/jackrabbit/mk/json/ test/java/org/apache/jackrabbit/mk/util/
Author: thomasm Date: Mon Jul 23 12:58:30 2012 New Revision: 1364616 URL: http://svn.apache.org/viewvc?rev=1364616view=rev Log: OAK-202 Simplify the code when possible Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopStreamTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/MicroKernelInputStreamTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1364616r1=1364615r2=1364616view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Mon Jul 23 12:58:30 2012 @@ -331,7 +331,7 @@ public abstract class AbstractBlobStore return; } else if (type == TYPE_DATA) { int len = IOUtils.readVarInt(idStream); -IOUtils.skipFully(idStream, (int) len); +IOUtils.skipFully(idStream, len); } else if (type == TYPE_HASH) { int level = IOUtils.readVarInt(idStream); // totalLength Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopStreamTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopStreamTest.java?rev=1364616r1=1364615r2=1364616view=diff == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopStreamTest.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopStreamTest.java Mon Jul 23 12:58:30 2012 @@ -19,8 +19,6 @@ package org.apache.jackrabbit.mk.json; import junit.framework.TestCase; import org.apache.jackrabbit.mk.util.StopWatch; -import java.io.IOException; - public class JsopStreamTest extends TestCase { // run the micro-benchmark @@ -57,7 +55,7 @@ public class JsopStreamTest extends Test testRawValue(new JsopTokenizer(s.toString())); } -private void testRawValue(JsopReader s) { +private static void testRawValue(JsopReader s) { for (int i = 0; i 3; i++) { assertFalse(s.matches('-')); assertTrue(s.matches('+')); @@ -193,7 +191,7 @@ public class JsopStreamTest extends Test } } -public void testBuilder() throws IOException { +public static void testBuilder() { JsopWriter buff = new JsopStream(); buff.tag('+').object(). Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java?rev=1364616r1=1364615r2=1364616view=diff == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Mon Jul 23 12:58:30 2012 @@ -19,8 +19,6 @@ package org.apache.jackrabbit.mk.json; import junit.framework.TestCase; import org.apache.jackrabbit.mk.util.StopWatch; -import java.io.IOException; - /** * Test the Jsop tokenizer and builder. */ @@ -36,7 +34,7 @@ public class JsopTest extends TestCase { for (int i = 0; i 1000; i++) { t2 += JsopBuilder.encode(s).length(); } -System.out.println(timer.seconds()); +System.out.println(timer.seconds() + dummy: + t2); } // old: not escaped: 5691 ms; escaped: 10609 ms // new: not escaped: 3931 ms; escaped: 11001 ms @@ -290,7 +288,7 @@ public class JsopTest extends TestCase { } } -public void testBuilder() throws IOException { +public void testBuilder() { JsopBuilder buff = new JsopBuilder(); buff.tag('+').object(). @@ -334,7 +332,7 @@ public class JsopTest extends TestCase { } -public void testEscape() throws IOException { +public void testEscape() { assertEquals(null, JsopBuilder.encode(null)); JsopBuilder buff = new JsopBuilder(). key(back\\slash).value(\\). Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java URL
svn commit: r1364960 - in /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large: CreateRandomNodesTraverseTest.java DescendantCountTest.java NodeCreator.java RandomNodeCreator.ja
Author: thomasm Date: Tue Jul 24 10:12:42 2012 New Revision: 1364960 URL: http://svn.apache.org/viewvc?rev=1364960view=rev Log: OAK-122 Performance test suite (RandomNodeCreator from Mete) Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/CreateRandomNodesTraverseTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/RandomNodeCreator.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/DescendantCountTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/NodeCreator.java Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/CreateRandomNodesTraverseTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/CreateRandomNodesTraverseTest.java?rev=1364960view=auto == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/CreateRandomNodesTraverseTest.java (added) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/CreateRandomNodesTraverseTest.java Tue Jul 24 10:12:42 2012 @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law + * or agreed to in writing, software distributed under the License is + * distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.apache.jackrabbit.mk.large; + +import org.apache.jackrabbit.mk.MultiMkTestBase; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** + * Creates and then reads nodes distributed in a tree with random width at each + * level. + */ +@RunWith(Parameterized.class) +public class CreateRandomNodesTraverseTest extends MultiMkTestBase { + +public CreateRandomNodesTraverseTest(String url) { +super(url); +} + +@Test +public void test() throws Exception { +RandomNodeCreator c = new RandomNodeCreator(mk, 1); +c.setTotalCount(200); +c.setMaxWidth(10); +// c.setLogToSystemOut(true); + +// 1 million node test +// c.setLogToSystemOut(true); +// c.setTotalCount(100); + +// 20 million node test +// c.setTotalCount(2000); + +c.create(); +c.traverse(); +} +} \ No newline at end of file Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/DescendantCountTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/DescendantCountTest.java?rev=1364960r1=1364959r2=1364960view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/DescendantCountTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/DescendantCountTest.java Tue Jul 24 10:12:42 2012 @@ -56,7 +56,7 @@ public class DescendantCountTest extends NodeCreator c = new NodeCreator(mk); for (int i = 1; i 20; i++) { -c.setNodeName(test + i); +c.setTestRoot(test + i); c.setWidth(2); c.setTotalCount(i); c.setData(null); Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/NodeCreator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/NodeCreator.java?rev=1364960r1=1364959r2=1364960view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/NodeCreator.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/large/NodeCreator.java Tue Jul 24 10:12:42 2012 @@ -23,11 +23,16 @@ import org.apache.jackrabbit.mk.api.Micr */ public class NodeCreator { +private static final String DEFAULT_TEST_ROOT = test; +private static final int DEFAULT_COUNT = 200; +private static final int DEFAULT_WIDTH = 30; + private final MicroKernel mk; +private String testRoot = DEFAULT_TEST_ROOT; +private int totalCount = DEFAULT_COUNT; +private int width = DEFAULT_WIDTH; private String
svn commit: r1364999 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ oak-jcr/src/main/java/org/
Author: thomasm Date: Tue Jul 24 12:10:33 2012 New Revision: 1364999 URL: http://svn.apache.org/viewvc?rev=1364999view=rev Log: OAK-182 Support for invisible internal content Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java?rev=1364999r1=1364998r2=1364999view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java Tue Jul 24 12:10:33 2012 @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.spi.state.NodeStateDiff; +import org.apache.jackrabbit.oak.spi.state.NodeStateUtils; import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; @@ -123,6 +124,9 @@ public class LuceneEditor implements Com @Override public void childNodeAdded(String name, NodeState after) { +if (NodeStateUtils.isHidden(name)) { +return; +} if (exception == null) { try { addSubtree(path + / + name, after); @@ -135,6 +139,9 @@ public class LuceneEditor implements Com @Override public void childNodeChanged( String name, NodeState before, NodeState after) { +if (NodeStateUtils.isHidden(name)) { +return; +} if (exception == null) { try { LuceneDiff diff = new LuceneDiff(writer, path + / + name); @@ -148,6 +155,9 @@ public class LuceneEditor implements Com @Override public void childNodeDeleted(String name, NodeState before) { +if (NodeStateUtils.isHidden(name)) { +return; +} if (exception == null) { try { deleteSubtree(path + / + name, before); Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java?rev=1364999view=auto == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java Tue Jul 24 12:10:33 2012 @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the License); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.oak.spi.state; + +/** + * Utility method for code that deals with node states. + */ +public class NodeStateUtils { + +/** + * Check whether the node or property with the given name is hidden, that + * is, if the node name starts with a :. + * + * @param name the node or property name + * @return true if the item is hidden + */ +public static boolean isHidden(String name) { +return name.startsWith(:); +} + +} Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java?rev=1364999r1=1364998r2=1364999view=diff
svn commit: r1365000 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/simple/ main/java/org/apache/jackrabbit/mk/wrapper/ main/java/org/apache/jackrabbit/oak/query/index/ te
Author: thomasm Date: Tue Jul 24 12:16:11 2012 New Revision: 1365000 URL: http://svn.apache.org/viewvc?rev=1365000view=rev Log: OAK-202 Simplify the code when possible Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeListTrie.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeMap.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/simple/AscendingClockTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FullTextTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/LikePatternTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeImpl.java?rev=1365000r1=1364999r2=1365000view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeImpl.java Tue Jul 24 12:16:11 2012 @@ -198,11 +198,11 @@ public class NodeImpl implements Cache.V throw ExceptionFactory.get(Node not found: + path); } long diffDescendant = -n.descendantCount; -long diffInline = -n.descendantInlineCount; +// long diffInline = -n.descendantInlineCount; NodeImpl n2 = n.cloneAndAddChildNode(path.substring(index + 1), before, position, newNode, revId); NodeImpl clone = setChild(child, n2, revId); diffDescendant += n2.descendantCount; -diffInline += n2.descendantInlineCount; +// diffInline += n2.descendantInlineCount; clone.descendantCount += diffDescendant; clone.descendantInlineCount += diffDescendant; return clone; @@ -625,17 +625,14 @@ public class NodeImpl implements Cache.V String key = t.readString(); t.read(':'); String value = t.readRawValue(); -if (key.length() 0 key.charAt(0) == ':') { -if (key.equals(CHILDREN)) { -node.childNodes = NodeListTrie.read(t, map, value); -} else if (key.equals(DESCENDANT_COUNT)) { -node.descendantCount = Long.parseLong(value); -descendantCountSet = true; -} else if (key.equals(HASH)) { - node.id.setHash(StringUtils.convertHexToBytes(JsopTokenizer.decodeQuoted(value))); -} else { -node.setProperty(key, value); -} +boolean hidden = key.length() 0 key.charAt(0) == ':'; +if (hidden key.equals(CHILDREN)) { +node.childNodes = NodeListTrie.read(t, map, value); +} else if (hidden key.equals(DESCENDANT_COUNT)) { +node.descendantCount = Long.parseLong(value); +descendantCountSet = true; +} else if (hidden key.equals(HASH)) { + node.id.setHash(StringUtils.convertHexToBytes(JsopTokenizer.decodeQuoted(value))); } else if (map.isId(value)) { if (node.childNodes == null) { node.childNodes = new NodeListSmall(); @@ -691,6 +688,9 @@ public class NodeImpl implements Cache.V } } +/** + * A visitor over the child nodes. + */ interface ChildVisitor { void accept(NodeId childId); } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/NodeListTrie.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache
svn commit: r1365002 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query: ./ qom/
Author: thomasm Date: Tue Jul 24 12:17:17 2012 New Revision: 1365002 URL: http://svn.apache.org/viewvc?rev=1365002view=rev Log: OAK-202 Simplify the code when possible Removed: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMVisitor.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/DynamicOperandImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/JoinConditionImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/LiteralImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMNode.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QueryObjectModelImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/SourceImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/StaticOperandImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java?rev=1365002r1=1365001r2=1365002view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Tue Jul 24 12:17:17 2012 @@ -79,7 +79,7 @@ public class QueryResultImpl implements @Override public RowIterator getRows() throws RepositoryException { -IteratorRowImpl it = new IteratorRowImpl() { +IteratorRowImpl rowIterator = new IteratorRowImpl() { private final Iterator? extends ResultRow it = result.getRows().iterator(); private RowImpl current; @@ -90,7 +90,7 @@ public class QueryResultImpl implements private void fetch() { current = null; -while(it.hasNext()) { +while (it.hasNext()) { ResultRow r = it.next(); for (String s : getSelectorNames()) { String path = r.getPath(s); @@ -123,7 +123,7 @@ public class QueryResultImpl implements } }; -return new RowIteratorAdapter(it); +return new RowIteratorAdapter(rowIterator); } @CheckForNull @@ -142,7 +142,7 @@ public class QueryResultImpl implements throw new RepositoryException(Query contains more than one selector: + Arrays.toString(getSelectorNames())); } -IteratorNodeImpl it = new IteratorNodeImpl() { +IteratorNodeImpl nodeIterator = new IteratorNodeImpl() { private final Iterator? extends ResultRow it = result.getRows().iterator(); private NodeImpl current; @@ -153,7 +153,7 @@ public class QueryResultImpl implements private void fetch() { current = null; -while(it.hasNext()) { +while (it.hasNext()) { ResultRow r = it.next(); String path = r.getPath(); if (includeRow(path)) { @@ -184,7 +184,7 @@ public class QueryResultImpl implements } }; -return new NodeIteratorAdapter(it); +return new NodeIteratorAdapter(nodeIterator); } Value createValue(CoreValue value) { Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/DynamicOperandImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/DynamicOperandImpl.java?rev=1365002r1=1365001r2=1365002view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/DynamicOperandImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/DynamicOperandImpl.java Tue Jul 24 12:17:17 2012 @@ -18,6 +18,9 @@ package org.apache.jackrabbit.oak.jcr.qu import javax.jcr.query.qom.DynamicOperand; +/** + * The base class for dynamic operands. + */ public abstract class DynamicOperandImpl extends QOMNode implements DynamicOperand { // base class without methods Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/JoinConditionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/JoinConditionImpl.java?rev=1365002r1
svn commit: r1365006 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query: ./ ast/
Author: thomasm Date: Tue Jul 24 12:24:30 2012 New Revision: 1365006 URL: http://svn.apache.org/viewvc?rev=1365006view=rev Log: OAK-28 Query implementation (mainly Javadocs) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ResultRowImpl.java 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/AndImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstVisitor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstVisitorBase.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeJoinConditionImpl.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/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrderingImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1365006r1=1365005r2=1365006view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Tue Jul 24 12:24:30 2012 @@ -349,6 +349,9 @@ public class Query { source.prepare(mk); } +/** + * An iterator over result rows. + */ class RowIterator implements IteratorResultRowImpl { private final String revisionId; Modified
svn commit: r1365072 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene: LuceneEditor.java LuceneIndex.java LuceneIndexProvider.java OakDirectory.java
Author: thomasm Date: Tue Jul 24 14:13:17 2012 New Revision: 1365072 URL: http://svn.apache.org/viewvc?rev=1365072view=rev Log: OAK-154 Full text search index - javadocs Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndexProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java?rev=1365072r1=1365071r2=1365072view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditor.java Tue Jul 24 14:13:17 2012 @@ -42,6 +42,9 @@ import static org.apache.jackrabbit.oak. import static org.apache.jackrabbit.oak.plugins.lucene.FieldFactory.newPropertyField; import static org.apache.jackrabbit.oak.plugins.lucene.TermFactory.newPathTerm; +/** + * This class updates a Lucene index when node content is changed. + */ public class LuceneEditor implements CommitEditor { private static final Tika TIKA = new Tika(); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java?rev=1365072r1=1365071r2=1365072view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java Tue Jul 24 14:13:17 2012 @@ -46,6 +46,9 @@ import org.apache.lucene.search.TermRang import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; +/** + * This index uses internally runs a query against a Lucene index. + */ public class LuceneIndex implements QueryIndex { private final NodeStore store; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndexProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndexProvider.java?rev=1365072r1=1365071r2=1365072view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndexProvider.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndexProvider.java Tue Jul 24 14:13:17 2012 @@ -25,6 +25,10 @@ import org.apache.jackrabbit.oak.spi.Que import org.apache.jackrabbit.oak.spi.QueryIndexProvider; import org.apache.jackrabbit.oak.spi.state.NodeStore; +/** + * A provider for Lucene indexes. There is exactly one Lucene index instance per + * MicroKernel. + */ public class LuceneIndexProvider implements QueryIndexProvider { @Override Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java?rev=1365072r1=1365071r2=1365072view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java Tue Jul 24 14:13:17 2012 @@ -37,6 +37,10 @@ import org.apache.lucene.store.NoLockFac import com.google.common.collect.Iterables; +/** + * An implementation of the Lucene directory (a flat list of files) that allows + * to store Lucene index content in an Oak repository. + */ class OakDirectory extends Directory { private final CoreValueFactory factory;
svn commit: r1368520 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/blobs/ test/java/org/apache/jackrabbit/mk/blobs/
Author: thomasm Date: Thu Aug 2 15:17:26 2012 New Revision: 1368520 URL: http://svn.apache.org/viewvc?rev=1368520view=rev Log: OAK-209 BlobStore: use SHA-256 instead of SHA-1, and use two directory levels for FileBlobStore Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/FileBlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStore.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1368520r1=1368519r2=1368520view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Thu Aug 2 15:17:26 2012 @@ -65,11 +65,13 @@ import java.util.WeakHashMap; */ public abstract class AbstractBlobStore implements Closeable, BlobStore, Cache.BackendAbstractBlobStore.BlockId, AbstractBlobStore.Data { -protected static final String HASH_ALGORITHM = SHA-1; +protected static final String HASH_ALGORITHM = SHA-256; protected static final int TYPE_DATA = 0; protected static final int TYPE_HASH = 1; protected static final int TYPE_HASH_COMPRESSED = 2; + +protected static final int BLOCK_SIZE_LIMIT = 48; protected MapString, WeakReferenceString inUse = Collections.synchronizedMap(new WeakHashMapString, WeakReferenceString()); @@ -78,7 +80,7 @@ public abstract class AbstractBlobStore * The minimum size of a block. Smaller blocks are inlined (the data store id * is the data itself). */ -private int blockSizeMin = 256; +private int blockSizeMin = 4096; /** * The size of a block. 128 KB has been found to be as fast as larger @@ -89,6 +91,7 @@ public abstract class AbstractBlobStore private CacheAbstractBlobStore.BlockId, Data cache = Cache.newInstance(this, 8 * 1024 * 1024); public void setBlockSizeMin(int x) { +validateBlockSize(x); this.blockSizeMin = x; } @@ -97,14 +100,23 @@ public abstract class AbstractBlobStore } public void setBlockSize(int x) { +validateBlockSize(x); this.blockSize = x; } + +private static void validateBlockSize(int x) { +if (x BLOCK_SIZE_LIMIT) { +throw new IllegalArgumentException( +The minimum size must be bigger + +than a content hash itself; limit = + BLOCK_SIZE_LIMIT); +} +} public int getBlockSize() { return blockSize; } -public String addBlob(String tempFilePath) throws Exception { +public String writeBlob(String tempFilePath) throws Exception { File file = new File(tempFilePath); InputStream in = null; try { @@ -273,13 +285,25 @@ public abstract class AbstractBlobStore } public Data load(BlockId id) { +byte[] data; try { -return new Data(readBlockFromBackend(id)); +data = readBlockFromBackend(id); } catch (Exception e) { -throw new RuntimeException(failed to read block from backend, e); +throw new RuntimeException(failed to read block from backend, id + id, e); +} +if (data == null) { +throw new IllegalArgumentException(The block with id + id + was not found); } +return new Data(data); } +/** + * Load the block from the storage backend. Returns null if the block was + * not found. + * + * @param id the block id + * @return the block data, or null + */ protected abstract byte[] readBlockFromBackend(BlockId id) throws Exception; public long getBlobLength(String blobId) throws IOException { Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java?rev=1368520r1=1368519r2=1368520view=diff
svn commit: r1368542 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java test/java/org/apache
Author: thomasm Date: Thu Aug 2 15:32:28 2012 New Revision: 1368542 URL: http://svn.apache.org/viewvc?rev=1368542view=rev Log: OAK-209 BlobStore: remove BlobStore.close() and writeBlob(String tempFilePath) as they don't seem to be needed currently Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1368542r1=1368541r2=1368542view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Thu Aug 2 15:32:28 2012 @@ -22,7 +22,6 @@ import org.apache.jackrabbit.mk.util.Str import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -63,7 +62,7 @@ import java.util.WeakHashMap; * long), size of data store id (variable size long), hash code length (variable * size int), hash code. */ -public abstract class AbstractBlobStore implements Closeable, BlobStore, Cache.BackendAbstractBlobStore.BlockId, AbstractBlobStore.Data { +public abstract class AbstractBlobStore implements BlobStore, Cache.BackendAbstractBlobStore.BlockId, AbstractBlobStore.Data { protected static final String HASH_ALGORITHM = SHA-256; @@ -116,6 +115,14 @@ public abstract class AbstractBlobStore return blockSize; } +/** + * Write a blob from a temporary file. The temporary file is removed + * afterwards. A file based blob stores might simply rename the file, so + * that no additional writes are necessary. + * + * @param tempFilePath the temporary file + * @return the blob id + */ public String writeBlob(String tempFilePath) throws Exception { File file = new File(tempFilePath); InputStream in = null; @@ -380,10 +387,6 @@ public abstract class AbstractBlobStore } } -public void close() { -// ignore -} - /** * A block id. Blocks are small enough to fit in memory, so they can be * cached. Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java?rev=1368542r1=1368541r2=1368542view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/BlobStore.java Thu Aug 2 15:32:28 2012 @@ -24,16 +24,6 @@ import java.io.InputStream; public interface BlobStore { /** - * Write a blob from a temporary file. The temporary file is removed - * afterwards. A file based blob stores might simply rename the file, so - * that no additional writes are necessary. - * - * @param tempFilePath the temporary file - * @return the blob id - */ -String writeBlob(String tempFilePath) throws Exception; - -/** * Write a blob from an input stream. * This method closes the input stream. * @@ -62,11 +52,4 @@ public interface BlobStore { */ long getBlobLength(String blobId) throws Exception; -/** - * Close all internally used resources, such as file handles. This method - * should be called at the end of the components lifecycle. After calling - * this method, the blob store should no longer be used. - */ -void close(); - } Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java?rev=1368542r1=1368541r2=1368542view=diff == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java Thu Aug 2 15:32:28 2012 @@ -47,10 +47,10 @@ public abstract class AbstractBlobStoreT public abstract void setUp() throws Exception; public void tearDown() throws Exception { -store.close
svn commit: r1371198 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java
Author: thomasm Date: Thu Aug 9 13:18:57 2012 New Revision: 1371198 URL: http://svn.apache.org/viewvc?rev=1371198view=rev Log: OAK-45 Add support for branching and merging - wrapper to simplify testing with MicroKernel implementations that don't support branch and merge Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java?rev=1371198view=auto == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/BranchMergeMicroKernel.java Thu Aug 9 13:18:57 2012 @@ -0,0 +1,216 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the License); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.mk.wrapper; + +import java.io.InputStream; +import java.util.HashSet; +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.mk.api.MicroKernelException; + +/** + * A MicroKernel wrapper that provides limited support for branch and merge even + * if the underlying implementation does not support it. + */ +public class BranchMergeMicroKernel implements MicroKernel { + +private static final String TRUNK = trunk; + +private final MicroKernel base; +private final HashSetString knownBranches = new HashSetString(); +private int nextBranch; +private String trunkHeadRevision; +private String busyBranch; + +public BranchMergeMicroKernel(MicroKernel base) { +this.base = base; +} + +@Override +public synchronized String branch(String trunkRevisionId) { +if (trunkRevisionId == null) { +trunkRevisionId = getHeadRevision(); +} +String head = base.getHeadRevision(); +String branchId = getBranchId(trunkRevisionId); +if (!TRUNK.equals(branchId)) { +throw new MicroKernelException(Cannot branch off a branch: ++ trunkRevisionId); +} +trunkHeadRevision = head; +String branch = b + nextBranch++; +knownBranches.add(branch); +String branchRev = branch + - + getHeadRevision(); +busyBranch = null; +return branchRev; +} + +private synchronized boolean isKnownBranch(String branchId) { +if (TRUNK.equals(branchId)) { +return false; +} +return knownBranches.contains(branchId); +} + +private static String getBranchId(String revisionId) { +int idx = revisionId.indexOf('-'); +if (idx = 0) { +return TRUNK; +} +return revisionId.substring(0, idx); +} + +private static String getRevisionId(String branchId, String revisionId) { +if (TRUNK.equals(branchId)) { +return revisionId; +} +return revisionId.substring(branchId.length() + 1); +} + +private static String getCombinedRevisionId(String branchId, +String revisionId) { +if (TRUNK.equals(branchId)) { +return revisionId; +} +return branchId + - + revisionId; +} + +@Override +public synchronized String commit(String path, String jsonDiff, +String revisionId, String message) { +if (revisionId == null) { +revisionId = getHeadRevision(); +} +String branchId = getBranchId(revisionId); +// if another branch is active, wait until it's changes are merged +while (true) { +if (!TRUNK.equals(branchId) !isKnownBranch(branchId)) { +throw new MicroKernelException(Unknown branch: + revisionId); +} +if (busyBranch == null || branchId.equals(busyBranch)) { +break; +} +try { +wait(1000); +} catch (InterruptedException e) { +// ignore
svn commit: r1371637 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java test/java/org/apache/jackrabbit/mk/json/JsopTest.java
Author: thomasm Date: Fri Aug 10 10:12:20 2012 New Revision: 1371637 URL: http://svn.apache.org/viewvc?rev=1371637view=rev Log: OAK-19 Consolidate JSON utilities - bugfix in readRawValue() Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java?rev=1371637r1=1371636r2=1371637view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java Fri Aug 10 10:12:20 2012 @@ -373,7 +373,7 @@ public class JsopTokenizer implements Js * Add an asterisk ('[*]') at the given position. This format is used to * show where parsing failed in a statement. * - * @param s the text + * @param s the text * @param index the position * @return the text with asterisk */ @@ -386,13 +386,14 @@ public class JsopTokenizer implements Js } /** - * Read a value and return the raw Json representation. + * Read a value and return the raw Json representation. This includes arrays + * and nested arrays. * * @return the Json representation of the value */ public String readRawValue() { int start = lastPos; -while (jsop.charAt(start) = ' ') { +while (start length jsop.charAt(start) = ' ') { start++; } skipRawValue(); @@ -402,13 +403,16 @@ public class JsopTokenizer implements Js private void skipRawValue() { switch (currentType) { case '[': { -read(); int level = 0; while (true) { -if (matches(']') level-- == 0) { -break; +if (matches(']')) { +if (--level == 0) { +break; +} } else if (matches('[')) { level++; +} else if (matches(JsopReader.END)) { +throw getFormatException(jsop, pos, value); } else { read(); } Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java?rev=1371637r1=1371636r2=1371637view=diff == --- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Fri Aug 10 10:12:20 2012 @@ -31,7 +31,7 @@ public class JsopTest extends TestCase { String s = Hello \World\ Hello \World\ Hello \World\ Hello \World\ Hello \World\ Hello \World\ ; StopWatch timer = new StopWatch(); int t2 = 0; -for (int i = 0; i 1000; i++) { +for (int i = 0; i 100; i++) { t2 += JsopBuilder.encode(s).length(); } System.out.println(timer.seconds() + dummy: + t2); @@ -61,8 +61,9 @@ public class JsopTest extends TestCase { assertEquals(\\/Date(0)\\/, t.getEscapedToken()); } -public void testNull() { -JsopTokenizer t = new JsopTokenizer(null, 1, null, true, false); +public void testNullTrueFalse() { +JsopTokenizer t; +t = new JsopTokenizer(null, 1, null, true, false); assertEquals(null, t.read(JsopReader.NULL)); assertEquals(,, t.read(',')); assertEquals(1, t.read(JsopReader.NUMBER)); @@ -72,6 +73,14 @@ public class JsopTest extends TestCase { assertEquals(true, t.read(JsopReader.TRUE)); assertEquals(,, t.read(',')); assertEquals(false, t.read(JsopReader.FALSE)); +t = new JsopTokenizer(true, false); +assertEquals(true, t.read(JsopReader.TRUE)); +assertEquals(,, t.read(',')); +assertEquals(false, t.read(JsopReader.FALSE)); +t = new JsopTokenizer(false, true); +assertEquals(false, t.read(JsopReader.FALSE)); +assertEquals(,, t.read(',')); +assertEquals(true, t.read(JsopReader.TRUE)); } public void testLineLength() { @@ -103,7 +112,22 @@ public class JsopTest extends TestCase { } public void testRawValue() { -JsopTokenizer t = new JsopTokenizer({\x\: [1], null, true, {\y\: 1}, error
svn commit: r1373280 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/api/ main/java/org/apache/jackrabbit/oak/core/ main/java/org/apache/jackrabbit/oak/plugins/identifier/
Author: thomasm Date: Wed Aug 15 09:21:05 2012 New Revision: 1373280 URL: http://svn.apache.org/viewvc?rev=1373280view=rev Log: OAK-241 QueryEngine.executeQuery needs a session parameter (partial) Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/SessionQueryEngine.java - copied, changed from r1372376, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SessionQueryEngineImpl.java Removed: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/ContentSession.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/ContentSession.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/ContentSession.java?rev=1373280r1=1373279r2=1373280view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/ContentSession.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/ContentSession.java Wed Aug 15 09:21:05 2012 @@ -82,7 +82,7 @@ public interface ContentSession extends * @return the query engine */ @Nonnull -QueryEngine getQueryEngine(); +SessionQueryEngine getQueryEngine(); /** * Returns the internal value factory. Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/SessionQueryEngine.java (from r1372376, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/SessionQueryEngine.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/SessionQueryEngine.javap1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.javar1=1372376r2=1373280rev=1373280view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/SessionQueryEngine.java Wed Aug 15 09:21:05 2012 @@ -26,7 +26,7 @@ import org.apache.jackrabbit.oak.namepat * p * What query languages are supported depends on the registered query parsers. */ -public interface QueryEngine { +public interface SessionQueryEngine { /** * Get the list of supported query languages. @@ -59,7 +59,7 @@ public interface QueryEngine { * @throws ParseException if the statement could not be parsed * @throws IllegalArgumentException if there was an error executing the query */ -Result executeQuery(String statement, String language, ContentSession session, +Result executeQuery(String statement, String language, long limit, long offset, MapString, CoreValue bindings, NamePathMapper namePathMapper) throws ParseException; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1373280r1=1373279r2=1373280view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Wed Aug 15 09:21:05 2012 @@ -29,7 +29,6 @@ import org.apache.jackrabbit.mk.core.Mic import org.apache.jackrabbit.mk.index.Indexer; import org.apache.jackrabbit.oak.api.ContentRepository; import org.apache.jackrabbit.oak.api.ContentSession; -import org.apache.jackrabbit.oak.api.QueryEngine; import org.apache.jackrabbit.oak.kernel.KernelNodeStore; import
svn commit: r1373282 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: SessionDelegate.java query/QueryManagerImpl.java
Author: thomasm Date: Wed Aug 15 09:22:01 2012 New Revision: 1373282 URL: http://svn.apache.org/viewvc?rev=1373282view=rev Log: OAK-241 QueryEngine.executeQuery needs a session parameter (partial) Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java?rev=1373282r1=1373281r2=1373282view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java Wed Aug 15 09:22:01 2012 @@ -39,7 +39,7 @@ import org.apache.jackrabbit.oak.api.Cha import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.ConflictHandler; import org.apache.jackrabbit.oak.api.ContentSession; -import org.apache.jackrabbit.oak.api.QueryEngine; +import org.apache.jackrabbit.oak.api.SessionQueryEngine; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.commons.PathUtils; @@ -396,7 +396,7 @@ public class SessionDelegate { } @Nonnull -public QueryEngine getQueryEngine() { +public SessionQueryEngine getQueryEngine() { return contentSession.getQueryEngine(); } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java?rev=1373282r1=1373281r2=1373282view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Wed Aug 15 09:22:01 2012 @@ -33,9 +33,8 @@ import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import javax.jcr.query.qom.QueryObjectModelFactory; -import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.CoreValue; -import org.apache.jackrabbit.oak.api.QueryEngine; +import org.apache.jackrabbit.oak.api.SessionQueryEngine; import org.apache.jackrabbit.oak.api.Result; import org.apache.jackrabbit.oak.jcr.SessionDelegate; import org.apache.jackrabbit.oak.jcr.query.qom.QueryObjectModelFactoryImpl; @@ -47,7 +46,7 @@ import org.apache.jackrabbit.oak.namepat public class QueryManagerImpl implements QueryManager { private final QueryObjectModelFactoryImpl qomFactory; -private final QueryEngine queryEngine; +private final SessionQueryEngine queryEngine; private final SessionDelegate sessionDelegate; private final HashSetString supportedQueryLanguages = new HashSetString(); @@ -105,9 +104,8 @@ public class QueryManagerImpl implements long limit, long offset, HashMapString, Value bindVariableMap) throws RepositoryException { try { HashMapString, CoreValue bindMap = convertMap(bindVariableMap); -ContentSession s = sessionDelegate.getContentSession(); NamePathMapper namePathMapper = sessionDelegate.getNamePathMapper(); -Result r = queryEngine.executeQuery(statement, language, s, limit, offset, bindMap, namePathMapper); +Result r = queryEngine.executeQuery(statement, language, limit, offset, bindMap, namePathMapper); return new QueryResultImpl(sessionDelegate, r); } catch (IllegalArgumentException e) { throw new InvalidQueryException(e);
svn commit: r1373283 - /jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java
Author: thomasm Date: Wed Aug 15 09:22:39 2012 New Revision: 1373283 URL: http://svn.apache.org/viewvc?rev=1373283view=rev Log: OAK-28 Query implementation Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java?rev=1373283r1=1373282r2=1373283view=diff == --- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java Wed Aug 15 09:22:39 2012 @@ -293,7 +293,7 @@ public class QomTest extends AbstractRep PropertyValue p = f.propertyValue(x, propertyName); c = f.and(f.comparison(p, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, b), c); Ordering o = f.ascending(p); -Column col = f.column(selectorName, propertyName, columnName); +Column col = f.column(x, propertyName, columnName); Ordering[] ords = new Ordering[]{o}; Column[] cols = new Column[]{col}; QueryObjectModel q = f.createQuery(s, c, ords, cols);
svn commit: r1373284 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ main/j
Author: thomasm Date: Wed Aug 15 09:23:38 2012 New Revision: 1373284 URL: http://svn.apache.org/viewvc?rev=1373284view=rev Log: OAK-28 Query implementation Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java 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/ChildNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeJoinConditionImpl.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/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/Filter.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1373284r1=1373283r2=1373284view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Wed Aug 15 09:23:38 2012 @@ -529,7 +529,6 @@ public class Indexer implements QueryInd // TODO allow creating multiple indexes in one step // (buffer indexes to be created; traverse the repository only once) -// TODO re-organize the index structure // TODO allow filters (only index a certain path; exclude a list of paths) if (PathUtils.getDepth(path) == indexRootNodeDepth + 1) { @@ -675,7 +674,7 @@ public class Indexer implements QueryInd if (index instanceof PropertyIndex) { qi = new PropertyContentIndex((PropertyIndex) index); } else if (index instanceof PrefixIndex) { -// TODO support prefix indexes? +// TODO support prefix indexes in the query engine? } queryIndexList.add(qi); } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1373284r1=1373283r2=1373284view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Wed Aug 15 09:23:38 2012 @@ -43,6 +43,7 @@ import java.util.HashMap; /** * The SQL2 parser can convert a JCR-SQL2 query to a query. + * The 'old' SQL query language is also supported if */ public class SQL2Parser { @@ -151,7 +152,12 @@ public class SQL2Parser { list.add(column
svn commit: r1373305 - in /jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance: DescendantSearchTest.java IndexManager.java SimpleSearchTest.java
Author: thomasm Date: Wed Aug 15 10:11:11 2012 New Revision: 1373305 URL: http://svn.apache.org/viewvc?rev=1373305view=rev Log: OAK-178 Query: index definition documentation and tooling Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/IndexManager.java Modified: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java Modified: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java?rev=1373305r1=1373304r2=1373305view=diff == --- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java (original) +++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java Wed Aug 15 10:11:11 2012 @@ -36,7 +36,9 @@ public class DescendantSearchTest extend protected Query createQuery(QueryManager manager, int i) throws RepositoryException { -return manager.createQuery(/jcr:root/testroot//element(*,nt:base)[@testcount= + i + ], Query.XPATH); +@SuppressWarnings(deprecation) +String xpath = Query.XPATH; +return manager.createQuery(/jcr:root/testroot//element(*,nt:base)[@testcount= + i + ], xpath); } @Override @@ -52,6 +54,9 @@ public class DescendantSearchTest extend } session.save(); } + +IndexManager.createPropertyIndex(session, testcount); + } @Override Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/IndexManager.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/IndexManager.java?rev=1373305view=auto == --- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/IndexManager.java (added) +++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/IndexManager.java Wed Aug 15 10:11:11 2012 @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the License); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.oak.performance; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import org.apache.jackrabbit.mk.index.Indexer; +import org.apache.jackrabbit.oak.commons.PathUtils; + +/** + * A utility class to manage indexes in Oak. + */ +public class IndexManager { + +/** + * The root node of the index definition (configuration) nodes. + */ +public static final String INDEX_CONFIG_PATH = Indexer.INDEX_CONFIG_PATH; + +/** + * Creates a property index for the given property if such an index doesn't + * exist yet, and if the repository supports property indexes. The session + * may not have pending changes. + * + * @param session the session + * @param propertyName the property name + * @return true if the index was created or already existed + */ +public static boolean createPropertyIndex(Session session, +String propertyName) throws RepositoryException { +return createIndex(session, property@ + propertyName); +} + +private static Node getIndexNode(Session session) +throws RepositoryException { +Node n = session.getRootNode(); +for (String e : PathUtils.elements(INDEX_CONFIG_PATH)) { +if (!n.hasNode(e)) { +return null; +} +n = n.getNode(e); +} +return n; +} + +private static boolean createIndex(Session session, String indexNodeName) +throws RepositoryException { +if (session.hasPendingChanges()) { +throw new RepositoryException(The session
svn commit: r1373371 - in /jackrabbit/oak/trunk/oak-bench: base/ base/src/main/java/org/apache/jackrabbit/oak/performance/ latest/src/test/java/org/apache/jackrabbit/oak/performance/
Author: thomasm Date: Wed Aug 15 12:40:47 2012 New Revision: 1373371 URL: http://svn.apache.org/viewvc?rev=1373371view=rev Log: OAK-122 Performance test suite - (avoid out of memory, make them reasonably fast to run by default but allow configuring longer running test using system properties) Modified: jackrabbit/oak/trunk/oak-bench/base/pom.xml jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java jackrabbit/oak/trunk/oak-bench/latest/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceBenchmark.java Modified: jackrabbit/oak/trunk/oak-bench/base/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/pom.xml?rev=1373371r1=1373370r2=1373371view=diff == --- jackrabbit/oak/trunk/oak-bench/base/pom.xml (original) +++ jackrabbit/oak/trunk/oak-bench/base/pom.xml Wed Aug 15 12:40:47 2012 @@ -48,6 +48,11 @@ scopeprovided/scope /dependency dependency + groupIdcom.h2database/groupId + artifactIdh2/artifactId + version1.3.158/version +/dependency +dependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version1.4/version Modified: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java?rev=1373371r1=1373370r2=1373371view=diff == --- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java (original) +++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java Wed Aug 15 12:40:47 2012 @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.perfor import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.Collections; import java.util.regex.Pattern; import javax.jcr.Credentials; @@ -28,13 +29,31 @@ import javax.jcr.SimpleCredentials; import org.apache.commons.io.output.FileWriterWithEncoding; import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; +import org.apache.jackrabbit.mk.MicroKernelFactory; +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.mk.core.MicroKernelImpl; +import org.apache.jackrabbit.mk.index.IndexWrapper; +import org.apache.jackrabbit.oak.api.ContentRepository; +import org.apache.jackrabbit.oak.core.ContentRepositoryImpl; import org.apache.jackrabbit.oak.jcr.RepositoryImpl; - +import org.apache.jackrabbit.oak.spi.commit.CompositeValidatorProvider; +import org.apache.jackrabbit.oak.spi.commit.ValidatingEditor; +import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider; + +/** + * This class calls all known performance tests. + */ public abstract class AbstractPerformanceTest { -private final int warmup = 1; - -private final int runtime = 10; +/** + * The warmup time, in ms. + */ +private final int warmup = Integer.getInteger(oak.performanceTest.warmup, 0); + +/** + * How long each test is repeated, in ms. + */ +private final int runtime = Integer.getInteger(oak.performanceTest.runtime, 100); private final Credentials credentials = new SimpleCredentials(admin, admin.toCharArray()); @@ -69,9 +88,12 @@ public abstract class AbstractPerformanc if (microKernelPattern.matcher(microKernel).matches() testPattern.matcher(test.toString()).matches()) { +MicroKernel mk = null; RepositoryImpl repository; try { -repository = createRepository(microKernel); + +mk = createMicroKernel(microKernel); +repository = createRepository(mk); // Run the test DescriptiveStatistics statistics = runTest(test, repository); @@ -82,6 +104,10 @@ public abstract class AbstractPerformanc re.printStackTrace(); } catch (Exception e) { e.printStackTrace(); +} finally { +if (mk != null) { +MicroKernelFactory.disposeInstance(mk); +} } } } @@ -93,13 +119,15 @@ public abstract class AbstractPerformanc test.setUp(repository, credentials); try { // Run a few iterations to warm up the system -long warmupEnd = System.currentTimeMillis() + warmup * 1000
svn commit: r1373373 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java
Author: thomasm Date: Wed Aug 15 12:45:14 2012 New Revision: 1373373 URL: http://svn.apache.org/viewvc?rev=1373373view=rev Log: OAK-122 Performance test suite - (allow concurrent branching) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1373373r1=1373372r2=1373373view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Wed Aug 15 12:45:14 2012 @@ -17,8 +17,10 @@ package org.apache.jackrabbit.mk.index; import java.io.InputStream; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.Set; import org.apache.jackrabbit.mk.ExceptionFactory; import org.apache.jackrabbit.mk.api.MicroKernel; @@ -36,7 +38,7 @@ public class IndexWrapper extends MicroK private final MicroKernelWrapper mk; private final Indexer indexer; -private final HashSetString branchRevisions = new HashSetString(); +private final SetString branchRevisions = Collections.synchronizedSet(new HashSetString()); public IndexWrapper(MicroKernel mk) { this.mk = MicroKernelWrapperBase.wrap(mk);
svn commit: r1375025 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/util/
Author: thomasm Date: Mon Aug 20 13:59:49 2012 New Revision: 1375025 URL: http://svn.apache.org/viewvc?rev=1375025view=rev Log: OAK-57 Remove empty directory Removed: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/util/
svn commit: r1375028 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java
Author: thomasm Date: Mon Aug 20 14:01:13 2012 New Revision: 1375028 URL: http://svn.apache.org/viewvc?rev=1375028view=rev Log: OAK-260 Avoid the Turkish Locale Problem Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java?rev=1375028r1=1375027r2=1375028view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/CoreValueMapper.java Mon Aug 20 14:01:13 2012 @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.kernel import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.jcr.PropertyType; @@ -39,7 +40,7 @@ public class CoreValueMapper { static { for (int type = PropertyType.UNDEFINED; type = PropertyType.DECIMAL; type++) { -String hint = PropertyType.nameFromValue(type).substring(0, 3).toLowerCase(); +String hint = PropertyType.nameFromValue(type).substring(0, 3).toLowerCase(Locale.ENGLISH); TYPE2HINT.put(type, hint); HINT2TYPE.put(hint, type); }
svn commit: r1375060 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/lucene/ main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/a
Author: thomasm Date: Mon Aug 20 15:29:56 2012 New Revision: 1375060 URL: http://svn.apache.org/viewvc?rev=1375060view=rev Log: OAK-262 Query: support pseudo properties like jcr:score() and rep:excerpt() Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/IndexRow.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java 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/JoinImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/Cursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/Filter.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneEditorTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingCursorTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java?rev=1375060r1=1375059r2=1375060view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/LuceneIndex.java Mon Aug 20 15:29:56 2012 @@ -27,9 +27,11 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.apache.jackrabbit.oak.query.index.IndexRowImpl; import org.apache.jackrabbit.oak.spi.Cursor; import org.apache.jackrabbit.oak.spi.Filter; import org.apache.jackrabbit.oak.spi.Filter.PropertyRestriction; +import org.apache.jackrabbit.oak.spi.IndexRow; import org.apache.jackrabbit.oak.spi.QueryIndex; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.spi.state.NodeStore; @@ -125,7 +127,8 @@ public class LuceneIndex implements Quer qs.add(new PrefixQuery(newPathTerm(path + /))); break; case DIRECT_CHILDREN: -qs.add(new PrefixQuery(newPathTerm(path + /))); // FIXME +// FIXME +qs.add(new PrefixQuery(newPathTerm(path + /))); break; case EXACT: qs.add(new TermQuery(newPathTerm(path))); @@ -136,7 +139,8 @@ public class LuceneIndex implements Quer String parent = path.substring(0, slash); qs.add(new TermQuery(newPathTerm(parent))); } else { -return null; // there's no parent of the root node +// there's no parent of the root node +return null; } break; } @@ -172,6 +176,9 @@ public class LuceneIndex implements Quer } } +/** + * A cursor over the resulting paths. + */ private static class PathCursor implements Cursor { private final IteratorString iterator; @@ -194,8 +201,9 @@ public class LuceneIndex implements Quer } @Override -public String currentPath() { -return path; +public IndexRow currentRow() { +// TODO support jcr:score and possibly rep:exceprt +return new IndexRowImpl(path); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1375060r1=1375059r2=1375060view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Mon Aug 20 15:29:56 2012 @@ -535,7 +535,7 @@ public class Query { } buff.append( from ).append(source); if (constraint
svn commit: r1375546 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java
Author: thomasm Date: Tue Aug 21 13:52:22 2012 New Revision: 1375546 URL: http://svn.apache.org/viewvc?rev=1375546view=rev Log: OAK-233 Query should use the NodeStore abstraction - property restrictions are anyway checked in the query engine, so the traversing cursor doesn't have to check it. Remove unneeded code (also because it doesn't support the new '*' property) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java?rev=1375546r1=1375545r2=1375546view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java Tue Aug 21 13:52:22 2012 @@ -16,15 +16,10 @@ package org.apache.jackrabbit.oak.query. import static org.apache.jackrabbit.oak.spi.Filter.PathRestriction.ALL_CHILDREN; import java.util.Deque; import java.util.Iterator; -import javax.jcr.PropertyType; -import org.apache.jackrabbit.oak.api.CoreValue; -import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry; -import org.apache.jackrabbit.oak.plugins.memory.StringValue; import org.apache.jackrabbit.oak.spi.Cursor; import org.apache.jackrabbit.oak.spi.Filter; -import org.apache.jackrabbit.oak.spi.Filter.PropertyRestriction; import org.apache.jackrabbit.oak.spi.IndexRow; import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeState; @@ -109,10 +104,7 @@ public class TraversingCursor implements nodes.addLast(node.getChildNodeEntries().iterator()); parentPath = currentPath; } - -if (matchesFilter(node, currentPath)) { -return true; -} +return true; } else { nodes.removeLast(); parentPath = PathUtils.getParentPath(parentPath); @@ -122,78 +114,4 @@ public class TraversingCursor implements return false; } -private boolean matchesFilter(NodeState node, String path) { -for (PropertyRestriction pr : filter.getPropertyRestrictions()) { -if (jcr:path.equals(pr.propertyName)) { -if (!matchesValue(new StringValue(path), pr)) { -return false; -} -} else { -PropertyState property = getProperty(node, pr.propertyName); -if (property == null) { -return false; -} else if (pr.first != null || pr.last != null) { -boolean matches = false; -for (CoreValue value : property.getValues()) { -if (matchesValue(value, pr)) { -matches = true; -} -} -if (!matches) { -return false; -} -} -} -} -return true; -} - -private static PropertyState getProperty(NodeState node, String path) { -int slash = path.indexOf('/'); -while (slash != -1) { -node = node.getChildNode(path.substring(0, slash)); -if (node == null) { -return null; -} -path = path.substring(slash + 1); -slash = path.indexOf('/'); -} -return node.getProperty(path); -} - -private static boolean matchesValue(CoreValue value, PropertyRestriction pr) { -int first = -1; -if (pr.first != null) { -first = compareValues(pr.first, value, pr.first.getType()); -} -if (first 0 || (first == 0 !pr.firstIncluding)) { -return false; -} - -int last = -1; -if (pr.last != null) { -last = compareValues(value, pr.last, pr.last.getType()); -} -if (last 0 || (last == 0 !pr.lastIncluding)) { -return false; -} - -return true; -} - -private static int compareValues(CoreValue a, CoreValue b, int type) { -if (type == PropertyType.BOOLEAN) { -return Boolean.valueOf(a.getBoolean()).compareTo( -Boolean.valueOf(b.getBoolean())); -} else if (type == PropertyType.DECIMAL) { -return a.getDecimal().compareTo(b.getDecimal()); -} else if (type == PropertyType.DOUBLE) { -return Double.compare
svn commit: r1375567 - /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java
Author: thomasm Date: Tue Aug 21 14:22:50 2012 New Revision: 1375567 URL: http://svn.apache.org/viewvc?rev=1375567view=rev Log: OAK-264 MicroKernel.diff for depth limited, unspecified changes - add {} Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java?rev=1375567r1=1375566r2=1375567view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/tree/DiffBuilder.java Tue Aug 21 14:22:50 2012 @@ -145,6 +145,7 @@ public class DiffBuilder { } else { buff.tag('^'); buff.key(p); +buff.object().endObject(); buff.newline(); } ++levels;
svn commit: r1375612 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java
Author: thomasm Date: Tue Aug 21 15:38:01 2012 New Revision: 1375612 URL: http://svn.apache.org/viewvc?rev=1375612view=rev Log: OAK-261 Support querying on property types Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java?rev=1375612r1=1375611r2=1375612view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java Tue Aug 21 15:38:01 2012 @@ -126,6 +126,9 @@ public class PropertyValueImpl extends D } private boolean matchesPropertyType(PropertyState state) { +if (state == null) { +return false; +} if (propertyType == PropertyType.UNDEFINED) { return true; }
svn commit: r1376003 - in /jackrabbit/oak/trunk/oak-core/src/test: java/org/apache/jackrabbit/oak/query/ resources/org/apache/jackrabbit/oak/query/
Author: thomasm Date: Wed Aug 22 11:44:45 2012 New Revision: 1376003 URL: http://svn.apache.org/viewvc?rev=1376003view=rev Log: OAK-28 Query implementation - split tests into sql1, sql2, sql2 explain, and xpath Added: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql1.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt - copied, changed from r1375949, jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_explain.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt - copied, changed from r1375949, jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Removed: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryXpathTest.txt Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1376003r1=1376002r2=1376003view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Wed Aug 22 11:44:45 2012 @@ -38,13 +38,23 @@ import org.junit.Test; public class QueryTest extends AbstractQueryTest { @Test -public void script() throws Exception { -test(queryTest.txt); +public void sql1() throws Exception { +test(sql1.txt); +} + +@Test +public void sql2() throws Exception { +test(sql2.txt); +} + +@Test +public void sql2Explain() throws Exception { +test(sql2_explain.txt); } @Test public void xpath() throws Exception { -test(queryXpathTest.txt); +test(xpath.txt); } @Test @@ -88,9 +98,9 @@ public class QueryTest extends AbstractQ line = line.trim(); if (line.startsWith(#) || line.length() == 0) { w.println(line); -} else if (line.startsWith(xpath)) { -line = line.substring(xpath.length()).trim(); -w.println(xpath + line); +} else if (line.startsWith(xpath2sql)) { +line = line.substring(xpath2sql.length()).trim(); +w.println(xpath2sql + line); XPathToSQL2Converter c = new XPathToSQL2Converter(); String got; try { Added: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql1.txt URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql1.txt?rev=1376003view=auto == --- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql1.txt (added) +++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql1.txt Wed Aug 22 11:44:45 2012 @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the License); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Syntax: +# * lines starting with # are remarks. +# * lines starting with select are queries, followed by expected results and an empty line +# * lines starting with explain are followed by expected query plan and an empty line +# * lines starting with sql1 are run using the sql1 language +# * lines starting with xpath2sql are just converted from xpath to sql2 +# * all other lines are are committed into the microkernel (line by line) +# * new tests are typically be added on top, after the syntax docs +# * use ascii character only + +# sql-1 query (nt:unstructured needs
svn commit: r1376004 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java
Author: thomasm Date: Wed Aug 22 11:45:42 2012 New Revision: 1376004 URL: http://svn.apache.org/viewvc?rev=1376004view=rev Log: OAK-261 Support querying on property types Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java?rev=1376004r1=1376003r2=1376004view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PrefixContentIndex.java Wed Aug 22 11:45:42 2012 @@ -44,29 +44,36 @@ public class PrefixContentIndex implemen @Override public double getCost(Filter filter) { -Filter.PropertyRestriction restriction = filter.getPropertyRestriction(*); -if (restriction == null) { -return Double.MAX_VALUE; +if (getPropertyTypeRestriction(filter) != null) { +return 100; } -if (restriction.first != restriction.last) { -// only support equality matches (for now) -return Double.MAX_VALUE; -} -if (restriction.propertyType == PropertyType.UNDEFINED) { -return Double.MAX_VALUE; -} -String hint = CoreValueMapper.getHintForType(restriction.propertyType); -String prefix = hint + :; -if (!prefix.equals(index.getPrefix())) { -// wrong prefix (wrong property type) -return Double.MAX_VALUE; +return Double.MAX_VALUE; +} + +private Filter.PropertyRestriction getPropertyTypeRestriction(Filter filter) { +for (Filter.PropertyRestriction restriction : filter.getPropertyRestrictions()) { +if (restriction == null) { +continue; +} +if (restriction.first != restriction.last) { +// only support equality matches (for now) +continue; +} +if (restriction.propertyType == PropertyType.UNDEFINED) { +continue; +} +String hint = CoreValueMapper.getHintForType(restriction.propertyType); +String prefix = hint + :; +if (prefix.equals(index.getPrefix())) { +return restriction; +} } -return 100; +return null; } @Override public String getPlan(Filter filter) { -Filter.PropertyRestriction restriction = filter.getPropertyRestriction(*); +Filter.PropertyRestriction restriction = getPropertyTypeRestriction(filter); if (restriction == null) { throw new IllegalArgumentException(No restriction for *); } @@ -78,7 +85,7 @@ public class PrefixContentIndex implemen @Override public Cursor query(Filter filter, String revisionId, NodeState root) { -Filter.PropertyRestriction restriction = filter.getPropertyRestriction(*); +Filter.PropertyRestriction restriction = getPropertyTypeRestriction(filter); if (restriction == null) { throw new IllegalArgumentException(No restriction for *); }
svn commit: r1376118 - /jackrabbit/oak/trunk/oak-jcr/pom.xml
Author: thomasm Date: Wed Aug 22 16:12:25 2012 New Revision: 1376118 URL: http://svn.apache.org/viewvc?rev=1376118view=rev Log: OAK-262 Query: support pseudo properties like jcr:score() and rep:excerpt() - re-enable tests Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1376118r1=1376117r2=1376118view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Wed Aug 22 16:12:25 2012 @@ -91,12 +91,6 @@ org.apache.jackrabbit.test.api.query.Sav org.apache.jackrabbit.test.api.query.SimpleSelectionTest#testSingleProperty org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType - -org.apache.jackrabbit.test.api.query.XPathQueryLevel2Test#testFullTextSearch -org.apache.jackrabbit.test.api.query.XPathQueryLevel2Test#testScoreColumn -org.apache.jackrabbit.test.api.query.XPathQueryLevel2Test#testPathColumn -org.apache.jackrabbit.test.api.query.TextNodeTest#testTextNodeTestContains - org.apache.jackrabbit.test.api.util org.apache.jackrabbit.test.api.observation.EventTest#testGetUserId org.apache.jackrabbit.test.api.observation.NodeMovedTest#testMoveNode
svn commit: r1376131 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ test/java/org/apache/jackrabbit/oak/query/ test/resources/org/apache/jackrabbit/oak/query/
Author: thomasm Date: Wed Aug 22 16:29:30 2012 New Revision: 1376131 URL: http://svn.apache.org/viewvc?rev=1376131view=rev Log: OAK-262 Query: support pseudo properties like jcr:score() and rep:excerpt() Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.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/SQL2Parser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1376131r1=1376130r2=1376131view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Wed Aug 22 16:29:30 2012 @@ -133,7 +133,13 @@ public class SQL2Parser { } Query q = new Query(source, constraint, orderings, columnArray, valueFactory); q.setExplain(explain); -q.init(); +try { +q.init(); +} catch (Exception e) { +ParseException e2 = new ParseException(query + : + e.getMessage(), 0); +e2.initCause(e); +throw e2; +} return q; } 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=1376131r1=1376130r2=1376131view=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 Wed Aug 22 16:29:30 2012 @@ -430,7 +430,8 @@ public class XPathToSQL2Converter { } else if (fn:name.equals(functionName)) { Function f = new Function(name); if (!readIf())) { -f.params.add(parseExpression()); +// only name(.) and name() are currently supported +read(.); read()); } return f; @@ -837,6 +838,9 @@ public class XPathToSQL2Converter { @Override public String toString() { +if (name.equals(*)) { +return name; +} return '[' + name + ']'; } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1376131r1=1376130r2=1376131view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Wed Aug 22 16:29:30 2012 @@ -103,16 +103,22 @@ public class QueryTest extends AbstractQ w.println(xpath2sql + line); XPathToSQL2Converter c = new XPathToSQL2Converter(); String got; +boolean failed; try { got = c.convert(line); +failed = false; } catch (ParseException e) { got = invalid: + e.getMessage().replace('\n', ' '); +failed = true; } line = r.readLine().trim(); w.println(got); if (!line.equals(got)) { errors = true; } +if (!failed) { +executeQuery(got, QueryEngineImpl.SQL2, null); +} } else if (line.startsWith(select) || line.startsWith(explain) || line.startsWith(sql1)) { w.println(line); String language = QueryEngineImpl.SQL2; Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt?rev=1376131r1=1376130r2=1376131view=diff
svn commit: r1379373 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: osgi/OsgiIndexProvider.java plugins/index/Indexer.java
Author: thomasm Date: Fri Aug 31 09:02:26 2012 New Revision: 1379373 URL: http://svn.apache.org/viewvc?rev=1379373view=rev Log: OAK-28 Query implementation Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/Indexer.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java?rev=1379373r1=1379372r2=1379373view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java Fri Aug 31 09:02:26 2012 @@ -84,7 +84,7 @@ public class OsgiIndexProvider implement if (providers.isEmpty()) { return Collections.emptyList(); } else if (providers.size() == 1) { -return providers.get(0).getQueryIndexes(mk); +return providers.entrySet().iterator().next().getValue().getQueryIndexes(mk); } else { // TODO combine indexes return null; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/Indexer.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/Indexer.java?rev=1379373r1=1379372r2=1379373view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/Indexer.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/Indexer.java Fri Aug 31 09:02:26 2012 @@ -416,6 +416,8 @@ public class Indexer implements QueryInd // unexpected but possible // this will cause all indexes to be removed, so // it can be ignored here +} else { +throw e; } } }
svn commit: r1383866 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/util/ test/java/org/apache/jackrabbit/oak/query/ test/java/org/apache/jackrabbit/oak/util/
Author: thomasm Date: Wed Sep 12 09:29:38 2012 New Revision: 1383866 URL: http://svn.apache.org/viewvc?rev=1383866view=rev Log: OAK-288 QueryTests should use the NodeStore apis - move JsopUtils to test folder Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java - copied, changed from r1383426, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/JsopUtil.java Removed: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/JsopUtil.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/JsopUtilTest.java Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java (from r1383426, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/JsopUtil.java) URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.javap1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/JsopUtil.javar1=1383426r2=1383866rev=1383866view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/JsopUtil.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java Wed Sep 12 09:29:38 2012 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.util; +package org.apache.jackrabbit.oak.query; import java.util.ArrayList; import java.util.Iterator; Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1383866r1=1383865r2=1383866view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Wed Sep 12 09:29:38 2012 @@ -35,7 +35,6 @@ import org.apache.jackrabbit.oak.api.Cor import org.apache.jackrabbit.oak.api.Result; import org.apache.jackrabbit.oak.api.ResultRow; import org.apache.jackrabbit.oak.core.DefaultConflictHandler; -import org.apache.jackrabbit.oak.util.JsopUtil; import org.junit.Ignore; import org.junit.Test; Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/JsopUtilTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/JsopUtilTest.java?rev=1383866r1=1383865r2=1383866view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/JsopUtilTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/util/JsopUtilTest.java Wed Sep 12 09:29:38 2012 @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.api.Cor import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.core.DefaultConflictHandler; +import org.apache.jackrabbit.oak.query.JsopUtil; import org.junit.Before; import org.junit.Test;
svn commit: r1383873 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java
Author: thomasm Date: Wed Sep 12 10:02:30 2012 New Revision: 1383873 URL: http://svn.apache.org/viewvc?rev=1383873view=rev Log: OAK-288 QueryTests should use the NodeStore apis - simplify JsopUtils Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java?rev=1383873r1=1383872r2=1383873view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/JsopUtil.java Wed Sep 12 10:02:30 2012 @@ -52,42 +52,34 @@ public class JsopUtil { * /p * * @param root - * @param commit - *- the commit string + * @param commit the commit string + * @param vf the value factory + * @throws UnsupportedOperationException if the operation is not supported */ public static void apply(Root root, String commit, CoreValueFactory vf) -throws Exception { +throws UnsupportedOperationException { int index = commit.indexOf(' '); String path = commit.substring(0, index).trim(); -commit = commit.substring(index).trim(); - -index = commit.indexOf(' '); -String op = commit.substring(0, index).trim(); -commit = commit.substring(index).trim(); - -if (!+.equals(op) !-.equals(op)) { -throw new Exception(Unknown operation + op -+ . This should be either '+' or '-'.); -} -if (commit.length() == 0) { -return; -} -boolean isAdd = +.equals(op); Tree c = root.getTree(path); if (c == null) { // TODO create intermediary? -throw new Exception(non existing path + path); +throw new UnsupportedOperationException(Non existing path + path); } -if (isAdd) { -addTree(c, commit, vf); +commit = commit.substring(index); +JsopTokenizer tokenizer = new JsopTokenizer(commit); +if (tokenizer.matches('-')) { +removeTree(c, tokenizer); +} else if (tokenizer.matches('+')) { +addTree(c, tokenizer, vf); } else { -removeTree(c, commit); +throw new UnsupportedOperationException( +Unsupported + (char) tokenizer.read() + +. This should be either '+' or '-'.); } } -private static void removeTree(Tree t, String pathIn) { -String path = new JsopTokenizer(pathIn).readString(); - +private static void removeTree(Tree t, JsopTokenizer tokenizer) { +String path = tokenizer.readString(); IteratorString pathIterator = PathUtils.elements(path).iterator(); while (pathIterator.hasNext()) { String p = pathIterator.next(); @@ -99,39 +91,26 @@ public class JsopUtil { t.remove(); } -private static void addTree(Tree t, String pathIn, CoreValueFactory vf) -throws Exception { -addTree(t, new JsopTokenizer(pathIn), vf); -} - -private static void addTree(Tree t, JsopTokenizer tokenizer, -CoreValueFactory vf) throws Exception { -if (!tokenizer.matches('}')) { -do { -String key = tokenizer.readString(); -tokenizer.read(':'); -if (tokenizer.matches('{')) { -addTree(t.addChild(key), tokenizer, vf); -} else { -String val = tokenizer.readRawValue(); -if (val.startsWith([)) { -val = val.substring(val.indexOf('[') + 1, -val.indexOf(']')); -ListCoreValue mvp = new ArrayListCoreValue(); -for (String v : val.split(,)) { -mvp.add(vf.createValue(JsopTokenizer.decodeQuoted(v -.trim(; -} -t.setProperty(key, mvp); -} else { -t.setProperty(key, vf.createValue(JsopTokenizer -.decodeQuoted(val.trim(; -} +private static void addTree(Tree t, JsopTokenizer tokenizer, CoreValueFactory vf) { +do { +String key = tokenizer.readString(); +tokenizer.read(':'); +if (tokenizer.matches('{')) { +Tree c = t.addChild(key); +if (!tokenizer.matches('}')) { +addTree(c, tokenizer, vf); +tokenizer.read
svn commit: r1384300 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java
Author: thomasm Date: Thu Sep 13 12:21:33 2012 New Revision: 1384300 URL: http://svn.apache.org/viewvc?rev=1384300view=rev Log: OAK-34 Define query API (javadocs) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java?rev=1384300r1=1384299r2=1384300view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java Thu Sep 13 12:21:33 2012 @@ -23,6 +23,21 @@ import org.apache.jackrabbit.oak.spi.sta /** * Represents an index. The index should use the data in the filter if possible * to speed up reading. + * p + * The query engine will pick the index that returns the lowest cost for the + * given filter conditions. + * p + * The index should only use that part of the filter that speeds up data lookup. + * All other filter conditions should be ignored and not evaluated within this + * index, because the query engine will in any case evaluate the condition (and + * join condition), so that evaluating the conditions within the index would + * actually slow down processing. For example, an index on the property + * lastName should not try to evaluate any other restrictions than those on + * the property lastName, even if the query contains other restrictions. For + * the query where lastName = 'x' and firstName = 'y', the query engine will + * set two filter conditions, one for lastName and another for firstName. + * The index on lastName should not evaluate the condition on firstName, + * even thought it will be set in the filter. */ public interface QueryIndex {
svn commit: r1384309 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java
Author: thomasm Date: Thu Sep 13 12:44:52 2012 New Revision: 1384309 URL: http://svn.apache.org/viewvc?rev=1384309view=rev Log: OAK-34 Define query API (javadocs) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java?rev=1384309r1=1384308r2=1384309view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java Thu Sep 13 12:44:52 2012 @@ -31,11 +31,26 @@ public interface Cursor { boolean next(); /** - * The current row within this index. The row usually only contains the - * path, but it may additionally contain so-called 'pseudo-properties' such - * as jcr:score and rep:excerpt, in case the index supports those - * properties and if the properties were requested when running the query. - * + * The current row within this index. + * p + * The row may only contains the path, if a path is available. It may also + * (or just) contain so-called pseudo-properties such as jcr:score and + * rep:excerpt, in case the index supports those properties and if the + * properties were requested when running the query. The query engine will + * indicate that those pseudo properties were requested by setting an + * appropriate (possibly unrestricted) filter condition. + * p + * The index should return a row with those properties that are stored in + * the index itself, so that the query engine doesn't have to load the whole + * row / node unnecessarily (avoiding to load the whole row is sometimes + * called index only scan), specially for rows that are anyway skipped. If + * the index does not have an (efficient) way to return some (or any) of the + * properties, it doesn't have to provide those values. In this case, the + * query engine will load the node itself if required. If all conditions + * match, the query engine will sometimes load the node to do access checks, + * but this is not always the case, and it is not the case if any of the + * (join) conditions do not match. + * * @return the row */ IndexRow currentRow();
svn commit: r1384344 - in /jackrabbit/oak/trunk/oak-core/src/test: java/org/apache/jackrabbit/oak/query/ resources/org/apache/jackrabbit/oak/query/
Author: thomasm Date: Thu Sep 13 14:29:59 2012 New Revision: 1384344 URL: http://svn.apache.org/viewvc?rev=1384344view=rev Log: OAK-288 QueryTests should use the NodeStore apis - re-enable the sql2_explain test Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_explain.txt Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1384344r1=1384343r2=1384344view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Thu Sep 13 14:29:59 2012 @@ -16,8 +16,8 @@ */ package org.apache.jackrabbit.oak.query; -import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.core.MicroKernelImpl; +import org.apache.jackrabbit.mk.index.IndexWrapper; import org.apache.jackrabbit.oak.AbstractOakTest; import org.apache.jackrabbit.oak.api.ContentRepository; import org.apache.jackrabbit.oak.api.ContentSession; @@ -44,10 +44,15 @@ public abstract class AbstractQueryTest @Override protected ContentRepository createRepository() { -MicroKernel mk = new MicroKernelImpl(); -Indexer indexer = new Indexer(mk); -PropertyIndexer pi = new PropertyIndexer(indexer); + +// the property and prefix index currently require the index wrapper +IndexWrapper mk = new IndexWrapper(new MicroKernelImpl()); +Indexer indexer = mk.getIndexer(); + +// MicroKernel mk = new MicroKernelImpl(); +// Indexer indexer = new Indexer(mk); +PropertyIndexer pi = new PropertyIndexer(indexer); QueryIndexProvider qip = new CompositeQueryIndexProvider(pi); CompositeHook hook = new CompositeHook(pi); return new ContentRepositoryImpl(mk, qip, hook); Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1384344r1=1384343r2=1384344view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Thu Sep 13 14:29:59 2012 @@ -211,7 +211,7 @@ public class QueryTest extends AbstractQ lines.add(e.toString()); } time = System.currentTimeMillis() - time; -if (time 3000) { +if (time 3000 !isDebugModeEnabled()) { fail(Query took too long: + query + took + time + ms); } return lines; @@ -234,4 +234,14 @@ public class QueryTest extends AbstractQ return qe.executeQuery(statement, language, Long.MAX_VALUE, 0, sv, null); } +/** + * Check whether the test is running in debug mode. + * + * @return true if debug most is (most likely) enabled + */ +private static boolean isDebugModeEnabled() { +return java.lang.management.ManagementFactory.getRuntimeMXBean(). +getInputArguments().toString().indexOf(-agentlib:jdwp) 0; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt?rev=1384344r1=1384343r2=1384344view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt (original) +++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt Thu Sep 13 14:29:59 2012 @@ -116,6 +116,8 @@ select * from [nt:base] as b where local select * from [nt:base] as x where isdescendantnode(x, '/') and not isdescendantnode(x, '/jcr:system') /jcr:system +/oak-index +/oak-index/indexes /test /test/jcr:resource /test/resource @@ -139,6 +141,7 @@ select * from [nt:base] as [p] where [p] select * from [nt:base] as p inner join [nt:base] as p2 on ischildnode(p2, p) where p.[jcr:path] = '/' /, /children /, /jcr:system +/, /oak-index /, /parents select * from [nt:base] as p inner join
svn commit: r1387100 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/
Author: thomasm Date: Tue Sep 18 11:49:47 2012 New Revision: 1387100 URL: http://svn.apache.org/viewvc?rev=1387100view=rev Log: OAK-144 Remove empty directory Removed: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/
svn commit: r1387515 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java test/resources/org/apache/jackrabbit/oak/query/xpath.txt
Author: thomasm Date: Wed Sep 19 10:37:27 2012 New Revision: 1387515 URL: http://svn.apache.org/viewvc?rev=1387515view=rev Log: OAK-36 Implement a query parser - XPath: rep:spellcheck parsed but not supported Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java 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=1387515r1=1387514r2=1387515view=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 Wed Sep 19 10:37:27 2012 @@ -575,7 +575,8 @@ public class XPathToSQL2Converter { private Expression parseFunction(String functionName) throws ParseException { if (jcr:like.equals(functionName)) { -Condition c = new Condition(parseExpression(), like, null, Expression.PRECEDENCE_CONDITION); +Condition c = new Condition(parseExpression(), +like, null, Expression.PRECEDENCE_CONDITION); read(,); c.right = parseExpression(); read()); @@ -602,6 +603,11 @@ public class XPathToSQL2Converter { f.params.add(parseExpression()); read()); return f; +} else if (fn:upper-case.equals(functionName)) { +Function f = new Function(upper); +f.params.add(parseExpression()); +read()); +return f; } else if (fn:name.equals(functionName)) { Function f = new Function(name); if (!readIf())) { @@ -611,19 +617,19 @@ public class XPathToSQL2Converter { } f.params.add(new SelectorExpr(currentSelector)); return f; -} else if (fn:upper-case.equals(functionName)) { -Function f = new Function(upper); -f.params.add(parseExpression()); -read()); -return f; } else if (jcr:deref.equals(functionName)) { - // TODO support jcr:deref + // TODO maybe support jcr:deref throw getSyntaxError(jcr:deref is not supported); } else if (rep:similar.equals(functionName)) { - // TODO support rep:similar + // TODO maybe support rep:similar throw getSyntaxError(rep:similar is not supported); +} else if (rep:spellcheck.equals(functionName)) { +// TODO maybe support rep:spellcheck as in +// /jcr:root[rep:spellcheck('${query}')]/(rep:spellcheck()) +throw getSyntaxError(rep:spellcheck is not supported); } else { -throw getSyntaxError(jcr:like | jcr:contains | jcr:score | jcr:deref | fn:lower-case | fn:upper-case); +throw getSyntaxError(jcr:like | jcr:contains | jcr:score | xs:dateTime | + +fn:lower-case | fn:upper-case | fn:name); } } 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=1387515r1=1387514r2=1387515view=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 Wed Sep 19 10:37:27 2012 @@ -367,7 +367,7 @@ xpath2sql //element(*, my:type)[@my:valu invalid: Query: //element(*, my:type)[@my:value = [(*)'x']; expected: @, true, false, -, +, *, ., @, ( xpath2sql //element(*, my:type)[jcr:strike(@title,'%Java%')] -invalid: Query: //element(*, my:type)[jcr:strike(@(*)title,'%Java%')]; expected: jcr:like | jcr:contains | jcr:score | jcr:deref | fn:lower-case | fn:upper-case +invalid: Query: //element(*, my:type)[jcr:strike(@(*)title,'%Java%')]; expected: jcr:like | jcr:contains | jcr:score | xs:dateTime | fn:lower-case | fn:upper-case | fn:name xpath2sql //element(*, my:type)[ invalid: Query: //element(*, my:type)(*)[; expected: fn:not, not, (, @, true, false, -, +, *, ., @, (
svn commit: r1387516 - in /jackrabbit/oak/trunk/oak-jcr/src: main/java/org/apache/jackrabbit/oak/jcr/query/ test/java/org/apache/jackrabbit/oak/jcr/query/
Author: thomasm Date: Wed Sep 19 10:39:03 2012 New Revision: 1387516 URL: http://svn.apache.org/viewvc?rev=1387516view=rev Log: OAK-300 Query: QueryResult.getRows().getSize() Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java?rev=1387516view=auto == --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java (added) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java Wed Sep 19 10:39:03 2012 @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.jackrabbit.oak.jcr.query; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * An iterator that pre-fetches a number of items in order to calculate the size + * of the result if possible. This iterator loads at least a number of items, + * and then tries to load some more items until the timeout is reached or the + * maximum number of entries are read. + * p + * Prefeching is only done when size() is called. + * + * @param K the iterator data type + */ +public class PrefetchIteratorK implements IteratorK { + +private final IteratorK it; +private final long minPrefetch, timeout, maxPrefetch; +private boolean prefetchDone; +private IteratorK prefetchIterator; +private long size, position; + +/** + * Create a new iterator. + * + * @param it the base iterator + * @param min the minimum number of items to pre-fetch + * @param timeout the maximum time to pre-fetch in milliseconds + * @param max the maximum number of items to pre-fetch + * @param size the size (prefetching is only required if -1) + */ +PrefetchIterator(IteratorK it, long min, long timeout, long max, long size) { +this.it = it; +this.minPrefetch = min; +this.timeout = timeout; +this.maxPrefetch = max; +this.size = size; +} + +@Override +public boolean hasNext() { +if (prefetchIterator != null) { +if (prefetchIterator.hasNext()) { +return true; +} +prefetchIterator = null; +} +boolean result = it.hasNext(); +if (!result) { +size = position; +} +return result; +} + +@Override +public K next() { +if (!hasNext()) { +throw new NoSuchElementException(); +} +if (prefetchIterator != null) { +return prefetchIterator.next(); +} +position++; +return it.next(); +} + +@Override +public void remove() { +throw new UnsupportedOperationException(); +} + +/** + * Get the size if known. This call might pre-fetch data. The returned value + * is unknown if the actual size is larger than the number of pre-fetched + * elements, unless the end of the iterator has been reached already. + * + * @return the size, or -1 if unknown + */ +public long size() { +if (size != -1 || prefetchDone || position maxPrefetch) { +return size; +} +prefetchDone = true; +ArrayListK list = new ArrayListK(); +long end; +if (timeout = 0) { +end = 0; +} else { +long nanos = System.nanoTime(); +end = nanos + timeout * 1000 * 1000; +} +while (position = maxPrefetch) { +if (position minPrefetch) { +if (end == 0 || System.nanoTime() end) { +break
svn commit: r1387999 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast: LengthImpl.java NodeNameImpl.java
Author: thomasm Date: Thu Sep 20 12:50:24 2012 New Revision: 1387999 URL: http://svn.apache.org/viewvc?rev=1387999view=rev Log: OAK-28 Query implementation: upper(x) / lower(x) / length(x) implies x is not null (prevent NPE) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java?rev=1387999r1=1387998r2=1387999view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java Thu Sep 20 12:50:24 2012 @@ -66,22 +66,24 @@ public class LengthImpl extends DynamicO @Override public void restrict(FilterImpl f, Operator operator, CoreValue v) { -switch (v.getType()) { -case PropertyType.LONG: -case PropertyType.DECIMAL: -case PropertyType.DOUBLE: -// ok - comparison with a number -break; -case PropertyType.BINARY: -case PropertyType.STRING: -case PropertyType.DATE: -// ok - compare with a string literal -break; -default: -throw new IllegalArgumentException( -Can not compare the length with a constant of type -+ PropertyType.nameFromValue(v.getType()) + - and value + v.toString()); +if (v != null) { +switch (v.getType()) { +case PropertyType.LONG: +case PropertyType.DECIMAL: +case PropertyType.DOUBLE: +// ok - comparison with a number +break; +case PropertyType.BINARY: +case PropertyType.STRING: +case PropertyType.DATE: +// ok - compare with a string literal +break; +default: +throw new IllegalArgumentException( +Can not compare the length with a constant of type ++ PropertyType.nameFromValue(v.getType()) + + and value + v.toString()); +} } // LENGTH(x) implies x is not null propertyValue.restrict(f, Operator.NOT_EQUAL, null); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java?rev=1387999r1=1387998r2=1387999view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java Thu Sep 20 12:50:24 2012 @@ -68,6 +68,9 @@ public class NodeNameImpl extends Dynami @Override public void restrict(FilterImpl f, Operator operator, CoreValue v) { +if (v == null) { +return; +} if (!isName(v)) { throw new IllegalArgumentException(Invalid name value: + v.toString()); }
svn commit: r1388000 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java test/java/org/apache/jackrabbit/oak/query/QueryTest.java test/resources/org
Author: thomasm Date: Thu Sep 20 12:51:57 2012 New Revision: 1388000 URL: http://svn.apache.org/viewvc?rev=1388000view=rev Log: OAK-322 XPath query is included in the exception message Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java 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/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1388000r1=1387999r2=1388000view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Thu Sep 20 12:51:57 2012 @@ -86,7 +86,11 @@ public class QueryEngineImpl { XPathToSQL2Converter converter = new XPathToSQL2Converter(); String sql2 = converter.convert(statement); SQL2Parser parser = new SQL2Parser(vf); -q = parser.parse(sql2); +try { +q = parser.parse(sql2); +} catch (ParseException e) { +throw new ParseException(statement + converted to SQL-2 + e.getMessage(), 0); +} } else { throw new ParseException(Unsupported language: + language, 0); } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1388000r1=1387999r2=1388000view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Thu Sep 20 12:51:57 2012 @@ -134,12 +134,16 @@ public class QueryTest extends AbstractQ } else if (line.startsWith(select) || line.startsWith(explain) || line.startsWith(measure) || -line.startsWith(sql1)) { +line.startsWith(sql1) || +line.startsWith(xpath)) { w.println(line); String language = QueryEngineImpl.SQL2; -if (line.startsWith(sql1)) { +if (line.startsWith(sql1 )) { language = QueryEngineImpl.SQL; line = line.substring(sql1 .length()); +} else if (line.startsWith(xpath )) { +language = QueryEngineImpl.XPATH; +line = line.substring(xpath .length()); } boolean readEnd = true; for (String resultLine : executeQuery(line, language)) { 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=1388000r1=1387999r2=1388000view=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 Thu Sep 20 12:51:57 2012 @@ -25,6 +25,9 @@ # jackrabbit test queries +xpath /jcr:root/testroot//*[0] +java.text.ParseException: /jcr:root/testroot//*[0] converted to SQL-2 Query: select [jcr:path], [jcr:score], * from [nt:base] as a where 0(*)is not null and isdescendantnode(a, '/testroot'); expected: NOT, ( + xpath2sql /test select [jcr:path], [jcr:score], * from [nt:base] as a where name(a) = 'test' and issamenode(a, '/')
svn commit: r1388002 - /jackrabbit/oak/trunk/oak-jcr/pom.xml
Author: thomasm Date: Thu Sep 20 12:53:49 2012 New Revision: 1388002 URL: http://svn.apache.org/viewvc?rev=1388002view=rev Log: OAK-28 Query implementation: upper(x) / lower(x) / length(x) implies x is not null (prevent NPE) Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1388002r1=1388001r2=1388002view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Thu Sep 20 12:53:49 2012 @@ -33,8 +33,6 @@ properties known.issues -org.apache.jackrabbit.test.api.query.qom.UpperLowerCaseTest#testLength -org.apache.jackrabbit.test.api.query.qom.UpperLowerCaseTest#testNodeName org.apache.jackrabbit.test.api.AddNodeTest#testSameNameSiblings!-- OAK-203 -- org.apache.jackrabbit.test.api.SessionTest#testMoveConstraintViolationExceptionSrc!--OAK-132-- org.apache.jackrabbit.test.api.SessionTest#testMoveConstraintViolationExceptionDest!--OAK-132--
svn commit: r1401633 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
Author: thomasm Date: Wed Oct 24 11:50:54 2012 New Revision: 1401633 URL: http://svn.apache.org/viewvc?rev=1401633view=rev Log: OAK-308 NodeIterator limit and offset don't work as expected Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1401633r1=1401632r2=1401633view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Oct 24 11:50:54 2012 @@ -308,7 +308,13 @@ public class Query { null); it = Arrays.asList(r).iterator(); } else { -it = new RowIterator(root, limit, offset); +if (orderings == null) { +// can apply limit and offset directly +it = new RowIterator(root, limit, offset); +} else { +// read and order first; skip and limit afterwards +it = new RowIterator(root, Long.MAX_VALUE, 0); +} long resultCount = 0; if (orderings != null) { // TODO order by is not necessary if the used index returns @@ -318,9 +324,25 @@ public class Query { ResultRowImpl r = it.next(); list.add(r); } -resultCount = size = list.size(); Collections.sort(list); +// if limit is set, possibly remove the tailing entries +// for list size 10, offset 2, limit 5: remove 3 +resultCount = list.size(); +// avoid overflow (both offset and limit could be Long.MAX_VALUE) +long keep = Math.min(list.size(), offset) + Math.min(list.size(), limit); +while (list.size() keep) { +// remove tail entries right now, to save memory (don't copy) +// remove the entries starting at the end, +// to avoid n^2 performance +list.remove(list.size() - 1); +} it = list.iterator(); +// skip the head (this is more efficient than removing +// if there are many entries) +for (int i = 0; i offset it.hasNext(); i++) { +it.next(); +} +size = list.size() - offset; } else if (measure) { while (it.hasNext()) { resultCount++;
svn commit: r1401651 - in /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query: ast/FullTextTest.java ast/LikePatternTest.java index/TraversingIndexTest.java
Author: thomasm Date: Wed Oct 24 12:37:58 2012 New Revision: 1401651 URL: http://svn.apache.org/viewvc?rev=1401651view=rev Log: OAK-28 Query: remove unused imports, document program flow Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/FullTextTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/LikePatternTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/FullTextTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/FullTextTest.java?rev=1401651r1=1401650r2=1401651view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/FullTextTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/FullTextTest.java Wed Oct 24 12:37:58 2012 @@ -23,7 +23,6 @@ import static org.junit.Assert.fail; import java.text.ParseException; -import org.apache.jackrabbit.oak.query.ast.FullTextSearchImpl; import org.junit.Test; /** Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/LikePatternTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/LikePatternTest.java?rev=1401651r1=1401650r2=1401651view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/LikePatternTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/LikePatternTest.java Wed Oct 24 12:37:58 2012 @@ -21,7 +21,6 @@ package org.apache.jackrabbit.oak.query. import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; -import org.apache.jackrabbit.oak.query.ast.ComparisonImpl; import org.junit.Test; /** Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java?rev=1401651r1=1401650r2=1401651view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java Wed Oct 24 12:37:58 2012 @@ -48,9 +48,19 @@ public class TraversingIndexTest { int slash = key.indexOf('/'); String revision = key.substring(0, slash); String path = key.substring(slash); -return new KernelNodeState(mk, path, revision, cache); +// this method is strictly called _after_ the cache is initialized, +// when the fields are set +return new KernelNodeState(getMicroKernel(), path, revision, getCache()); } }); + +MicroKernel getMicroKernel() { +return mk; +} + +LoadingCacheString, KernelNodeState getCache() { +return cache; +} @Test public void traverse() throws Exception {
svn commit: r1401716 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast: ComparisonImpl.java PropertyValueImpl.java SelectorImpl.java SourceImpl.java
Author: thomasm Date: Wed Oct 24 14:53:16 2012 New Revision: 1401716 URL: http://svn.apache.org/viewvc?rev=1401716view=rev Log: OAK-361 QueryEngine JCR-SQL 'ESCAPE' parsing support OAK-347 QueryEngine 'like' interpretation error for paths Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java?rev=1401716r1=1401715r2=1401716view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java Wed Oct 24 14:53:16 2012 @@ -136,28 +136,35 @@ public class ComparisonImpl extends Cons public void restrict(FilterImpl f) { PropertyValue v = operand2.currentValue(); if (v != null) { -operand1.restrict(f, operator, v); + // operand1.restrict(f, operator, v); // TODO OAK-347 -//if (operator == Operator.LIKE) { -//String pattern; -//pattern = v.getString(); -//LikePattern p = new LikePattern(pattern); -//String lowerBound = p.getLowerBound(); -//String upperBound = p.getUpperBound(); -//if (lowerBound == null upperBound == null) { -//// ignore -//} else if (operand1.supportsRangeConditions()) { -//CoreValueFactory vf = query.getValueFactory(); -//if (lowerBound != null) { -//operand1.restrict(f, Operator.GREATER_OR_EQUAL, vf.createValue(lowerBound)); -//} -//if (upperBound != null) { -//operand1.restrict(f, Operator.LESS_OR_EQUAL, vf.createValue(upperBound)); -//} -//} -//} else { -//operand1.restrict(f, operator, v); -//} +if (operator == Operator.LIKE) { +String pattern; +pattern = v.getValue(Type.STRING); +LikePattern p = new LikePattern(pattern); +String lowerBound = p.getLowerBound(); +String upperBound = p.getUpperBound(); +if (lowerBound == null upperBound == null) { +// ignore +} else if (lowerBound.equals(upperBound)) { +// no wildcards +operand1.restrict(f, Operator.EQUAL, v); +} else if (operand1.supportsRangeConditions()) { +if (lowerBound != null) { +PropertyValue pv = PropertyValues.newString(lowerBound); +operand1.restrict(f, Operator.GREATER_OR_EQUAL, pv); +} +if (upperBound != null) { +PropertyValue pv = PropertyValues.newString(upperBound); +operand1.restrict(f, Operator.LESS_OR_EQUAL, pv); +} +} else { +// path conditions +operand1.restrict(f, operator, v); +} +} else { +operand1.restrict(f, operator, v); +} } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java?rev=1401716r1=1401715r2=1401716view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java Wed Oct 24 14:53:16 2012 @@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.api.Pro import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.commons.PathUtils; +import org.apache.jackrabbit.oak.query.Query; import org.apache.jackrabbit.oak.query.SQL2Parser; import org.apache.jackrabbit.oak.query.index.FilterImpl; import org.apache.jackrabbit.oak.spi.query.PropertyValues; @@ -80,6 +81,14
svn commit: r1402137 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
Author: thomasm Date: Thu Oct 25 13:04:56 2012 New Revision: 1402137 URL: http://svn.apache.org/viewvc?rev=1402137view=rev Log: OAK-400 The query engine should pick the index with the lowest cost Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1402137r1=1402136r2=1402137view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Thu Oct 25 13:04:56 2012 @@ -115,6 +115,7 @@ public class QueryEngineImpl { for (QueryIndex index : getIndexes()) { double cost = index.getCost(filter); if (cost bestCost) { +bestCost = cost; best = index; } }
svn commit: r1402144 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
Author: thomasm Date: Thu Oct 25 13:25:16 2012 New Revision: 1402144 URL: http://svn.apache.org/viewvc?rev=1402144view=rev Log: OAK-402 Refactor query and index tests Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1402144r1=1402143r2=1402144view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Thu Oct 25 13:25:16 2012 @@ -120,7 +120,7 @@ public abstract class AbstractQueryTest @Test @Ignore(OAK-336) -public void sql2_measure() throws Exception { +public void sql2Measure() throws Exception { test(sql2_measure.txt); }
svn commit: r1404899 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: plugins/index/old/ query/ spi/query/
Author: thomasm Date: Fri Nov 2 09:08:59 2012 New Revision: 1404899 URL: http://svn.apache.org/viewvc?rev=1404899view=rev Log: OAK-404 Log (slow) queries (log all queries and query plans with log level 'debug') Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixIndex.java?rev=1404899r1=1404898r2=1404899view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixIndex.java Fri Nov 2 09:08:59 2012 @@ -132,5 +132,10 @@ public class PrefixIndex implements PInd public boolean isUnique() { return tree.isUnique(); } + +@Override +public String toString() { +return getIndexNodeName(); +} } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java?rev=1404899r1=1404898r2=1404899view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java Fri Nov 2 09:08:59 2012 @@ -112,5 +112,10 @@ public class PropertyContentIndex implem return false; } } + +@Override +public String toString() { +return index.toString(); +} } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyIndex.java?rev=1404899r1=1404898r2=1404899view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyIndex.java Fri Nov 2 09:08:59 2012 @@ -136,5 +136,10 @@ public class PropertyIndex implements PI public boolean isUnique() { return tree.isUnique(); } + +@Override +public String toString() { +return getIndexNodeName(); +} } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1404899r1=1404898r2=1404899view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Fri Nov 2 09:08:59 2012 @@ -53,6 +53,8 @@ import org.apache.jackrabbit.oak.spi.que import org.apache.jackrabbit.oak.spi.query.PropertyValues; import org.apache.jackrabbit.oak.spi.query.QueryIndex; import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Represents a parsed query. Lifecycle: use the constructor to create a new @@ -72,6 +74,8 @@ public class Query { */ public static final String JCR_SCORE = jcr:score; +private static final Logger LOG = LoggerFactory.getLogger(QueryEngineImpl.class); + final SourceImpl source; final ConstraintImpl constraint; final HashMapString, PropertyValue bindVariableMap = new HashMapString, PropertyValue(); @@ -308,6 +312,9 @@ public class Query { null); it = Arrays.asList(r).iterator(); } else { +if (LOG.isDebugEnabled
svn commit: r1404926 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ast/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/ test/java/org/apache/jackrabbit/o
Author: thomasm Date: Fri Nov 2 11:23:07 2012 New Revision: 1404926 URL: http://svn.apache.org/viewvc?rev=1404926view=rev Log: OAK-419 Query: Conditions are not pushed to outer join selectors OAK-420 Query: Lucene index problem with isdescendantnode Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_measure.txt Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java?rev=1404926r1=1404925r2=1404926view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NotImpl.java Fri Nov 2 11:23:07 2012 @@ -52,6 +52,21 @@ public class NotImpl extends ConstraintI @Override public void restrict(FilterImpl f) { +if (f.getSelector().outerJoin) { +// we need to be careful with the condition +// NOT (property IS NOT NULL) +// (which is the same as +// property IS NULL) because +// this might cause an index to ignore +// the join condition property = x +// for example in: +// select * from a left outer join b on a.x = b.y +// where not b.y is not null +// must not result in the index to check for +// b.y is null, because that would alter the +// result +return; +} // ignore // TODO convert NOT conditions } 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=1404926r1=1404925r2=1404926view=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 Fri Nov 2 11:23:07 2012 @@ -126,13 +126,20 @@ public class SelectorImpl extends Source if (joinCondition != null) { joinCondition.restrict(f); } -if (!outerJoin) { -// for outer joins, query constraints can't be applied to the -// filter, because that would alter the result -if (queryConstraint != null) { -queryConstraint.restrict(f); -} + +// all conditions can be pushed to the selectors - +// except in some cases to outer joined selectors, +// but the exceptions are handled in the condition +// itself. +// An example where it *is* a problem: +// select * from a left outer join b on a.x = b.y +// where b.y is null - in this case the selector b +// must not use an index condition on y is null +// (.. is null must be written as not .. is not null). +if (queryConstraint != null) { +queryConstraint.restrict(f); } + return f; } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexQueryTest.java?rev=1404926r1=1404925r2=1404926view=diff == --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexQueryTest.java Fri Nov 2 11:23:07 2012 @@ -22,6 +22,8 @@ import org.apache.jackrabbit.oak.api.Tre import org.apache.jackrabbit.oak.plugins.index.IndexHookManager; import org.apache.jackrabbit.oak.plugins.nodetype.InitialContent; import org.apache.jackrabbit.oak.query.AbstractQueryTest; +import org.junit.Ignore; +import org.junit.Test; /** * Tests the query engine using the default index implementation
svn commit: r1405746 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/index/old/ main/java/org/apache/jackrabbit/oak/plugins/index/property/ main/java/org/apache/ja
Author: thomasm Date: Mon Nov 5 11:08:46 2012 New Revision: 1405746 URL: http://svn.apache.org/viewvc?rev=1405746view=rev Log: OAK-404 Log (slow) queries (log queries with level warn if more than 100 nodes are traversed) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java?rev=1405746r1=1405745r2=1405746view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java Mon Nov 5 11:08:46 2012 @@ -134,5 +134,10 @@ public class PrefixContentIndex implemen return false; } } + +@Override +public String toString() { +return index.toString(); +} } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java?rev=1405746r1=1405745r2=1405746view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java Mon Nov 5 11:08:46 2012 @@ -138,7 +138,7 @@ public class PropertyIndex implements Qu if (paths != null) { return new PathCursor(paths); } else { -return new TraversingCursor(filter, root); +return new TraversingCursor(?, filter, root); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1405746r1=1405745r2=1405746view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Mon Nov 5 11:08:46 2012 @@ -77,6 +77,7 @@ public class Query { private static final Logger LOG = LoggerFactory.getLogger(QueryEngineImpl.class); final SourceImpl source; +final String statement; final ConstraintImpl constraint; final HashMapString, PropertyValue bindVariableMap = new HashMapString, PropertyValue(); final HashMapString, Integer selectorIndexes = new HashMapString, Integer(); @@ -93,8 +94,9 @@ public class Query { private Root root; private NamePathMapper namePathMapper; -Query(SourceImpl source, ConstraintImpl constraint, OrderingImpl[] orderings, +Query(String statement, SourceImpl source, ConstraintImpl constraint, OrderingImpl[] orderings, ColumnImpl[] columns) { +this.statement = statement; this.source = source; this.constraint = constraint; this.orderings = orderings; @@ -566,7 +568,7 @@ public class Query { } public QueryIndex getBestIndex(Filter filter) { -return queryEngine.getBestIndex(filter); +return queryEngine.getBestIndex(this, filter); } public void setRoot(Root root) { @@ -617,4 +619,8 @@ public class Query { return size; } +public String getStatement() { +return statement; +} + } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev
svn commit: r1406124 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast: DescendantNodeImpl.java SelectorImpl.java
Author: thomasm Date: Tue Nov 6 13:17:11 2012 New Revision: 1406124 URL: http://svn.apache.org/viewvc?rev=1406124view=rev Log: OAK-423 Query: org.apache.jackrabbit.oak.spi.query.Cursor.currentRow called too late Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java?rev=1406124r1=1406123r2=1406124view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java Tue Nov 6 13:17:11 2012 @@ -39,8 +39,11 @@ public class DescendantNodeImpl extends @Override public boolean evaluate() { String p = selector.currentPath(); +if (p == null) { +return false; +} String path = getAbsolutePath(ancestorPath); -if (p == null || path == null) { +if (path == null) { return false; } return PathUtils.isAncestor(path, p); 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=1406124r1=1406123r2=1406124view=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 Tue Nov 6 13:17:11 2012 @@ -164,6 +164,7 @@ public class SelectorImpl extends Source } return true; } +cursor = null; return false; }
svn commit: r1406128 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java
Author: thomasm Date: Tue Nov 6 13:29:45 2012 New Revision: 1406128 URL: http://svn.apache.org/viewvc?rev=1406128view=rev Log: OAK-423 Query: org.apache.jackrabbit.oak.spi.query.Cursor.currentRow called too late (prevent future bugs) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java?rev=1406128r1=1406127r2=1406128view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java Tue Nov 6 13:29:45 2012 @@ -121,6 +121,8 @@ public class Cursors { private long readCount; +private boolean closed; + public TraversingCursor(String statement, Filter filter, NodeState root) { this.statement = statement; this.filter = filter; @@ -170,6 +172,9 @@ public class Cursors { @Override public IndexRow currentRow() { +if (closed) { +throw new IllegalStateException(This cursor is closed); +} return new IndexRowImpl(currentPath); } @@ -204,6 +209,7 @@ public class Cursors { } } currentPath = null; +closed = true; return false; }
svn commit: r1406676 - /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java
Author: thomasm Date: Wed Nov 7 15:30:25 2012 New Revision: 1406676 URL: http://svn.apache.org/viewvc?rev=1406676view=rev Log: OAK-123 Data store improvements Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1406676r1=1406675r2=1406676view=diff == --- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original) +++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Wed Nov 7 15:30:25 2012 @@ -218,6 +218,17 @@ public abstract class AbstractBlobStore in.close(); } +/** + * Store a block of data. + * + * @param digest the content hash + * @param level the indirection level (0 is for user data, 1 is a list of + *digests that point to user data, 2 is a list of digests that + *point to digests, and so on). This parameter is for + *informational use only, and it is not required to store it + *unless that's easy to achieve + * @param data the data to be stored + */ protected abstract void storeBlock(byte[] digest, int level, byte[] data) throws Exception; public abstract void startMark() throws Exception; @@ -421,6 +432,14 @@ public abstract class AbstractBlobStore public String toString() { return StringUtils.convertBytesToHex(digest) + @ + pos; } + +public byte[] getDigest() { +return digest; +} + +public long getPos() { +return pos; +} }
svn commit: r1408729 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/ oak-c
Author: thomasm Date: Tue Nov 13 14:05:32 2012 New Revision: 1408729 URL: http://svn.apache.org/viewvc?rev=1408729view=rev Log: OAK-425 Query Index: pass the query statement to the index for logging purposes Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java?rev=1408729r1=1408728r2=1408729view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java Tue Nov 13 14:05:32 2012 @@ -28,7 +28,6 @@ import org.apache.jackrabbit.JcrConstant import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.core.ReadOnlyTree; -import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexLookup; import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants; import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager; import org.apache.jackrabbit.oak.spi.query.Cursor; @@ -68,7 +67,7 @@ class NodeTypeIndex implements QueryInde public Cursor query(Filter filter, NodeState root) { NodeTypeIndexLookup lookup = new NodeTypeIndexLookup(root); if (!hasNodeTypeRestriction(filter) || !lookup.isIndexed(filter.getPath())) { -return Cursors.newTraversingCursor(?, filter, root); +return Cursors.newTraversingCursor(filter, root); } return Cursors.newPathCursor(lookup.find( resolveNodeType(root, filter.getNodeType(; @@ -97,7 +96,7 @@ class NodeTypeIndex implements QueryInde SetString ntNames = Sets.newHashSet(); try { NodeType nt = ntMgr.getNodeType(nodeType); -for (NodeTypeIterator types = nt.getSubtypes(); types.hasNext(); ) { +for (NodeTypeIterator types = nt.getSubtypes(); types.hasNext();) { ntNames.add(types.nextNodeType().getName()); } ntNames.add(nodeType); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java?rev=1408729r1=1408728r2=1408729view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java Tue Nov 13 14:05:32 2012 @@ -142,7 +142,7 @@ public class PropertyIndex implements Qu if (paths != null) { return Cursors.newPathCursor(paths); } else { -return Cursors.newTraversingCursor(?, filter, root); +return Cursors.newTraversingCursor(filter, root); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1408729r1=1408728r2=1408729view=diff
svn commit: r1409171 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: plugins/index/old/PrefixContentIndex.java plugins/index/old/PropertyContentIndex.java spi/query/Cursor
Author: thomasm Date: Wed Nov 14 11:47:48 2012 New Revision: 1409171 URL: http://svn.apache.org/viewvc?rev=1409171view=rev Log: OAK-423 Query: org.apache.jackrabbit.oak.spi.query.Cursor.currentRow called too late - refactor the Cursor interface to extend IteratorIndexRow Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java?rev=1409171r1=1409170r2=1409171view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PrefixContentIndex.java Wed Nov 14 11:47:48 2012 @@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.spi.que import org.apache.jackrabbit.oak.spi.query.Filter; import org.apache.jackrabbit.oak.spi.query.IndexRow; import org.apache.jackrabbit.oak.spi.query.QueryIndex; +import org.apache.jackrabbit.oak.spi.query.Cursors.AbstractCursor; import org.apache.jackrabbit.oak.spi.state.NodeState; /** @@ -108,7 +109,7 @@ public class PrefixContentIndex implemen /** * The cursor to for this index. */ -static class ContentCursor implements Cursor { +static class ContentCursor extends AbstractCursor { private final IteratorString it; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java?rev=1409171r1=1409170r2=1409171view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/old/PropertyContentIndex.java Wed Nov 14 11:47:48 2012 @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.spi.que import org.apache.jackrabbit.oak.spi.query.Filter; import org.apache.jackrabbit.oak.spi.query.IndexRow; import org.apache.jackrabbit.oak.spi.query.QueryIndex; +import org.apache.jackrabbit.oak.spi.query.Cursors.AbstractCursor; import org.apache.jackrabbit.oak.spi.state.NodeState; /** @@ -88,7 +89,7 @@ public class PropertyContentIndex implem /** * The cursor to for this index. */ -static class ContentCursor implements Cursor { +static class ContentCursor extends AbstractCursor { private final IteratorString it; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java?rev=1409171r1=1409170r2=1409171view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursor.java Wed Nov 14 11:47:48 2012 @@ -18,10 +18,12 @@ */ package org.apache.jackrabbit.oak.spi.query; +import java.util.Iterator; + /** * A cursor to read a number of nodes sequentially. */ -public interface Cursor { +public interface Cursor extends IteratorIndexRow { /** * The next row within this index. @@ -46,8 +48,7 @@ public interface Cursor { * * @return the row */ +@Override IndexRow next(); -boolean hasNext(); - } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java?rev=1409171r1=1409170r2=1409171view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java Wed Nov 14 11:47:48 2012 @@ -65,12 +65,25 @@ public class Cursors
svn commit: r1412128 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ oak-core/src/test/resources/org/apa
Author: thomasm Date: Wed Nov 21 14:34:36 2012 New Revision: 1412128 URL: http://svn.apache.org/viewvc?rev=1412128view=rev Log: OAK-295 Jackrabbit query with spaces in node names Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.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.txt jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/qom/QOMNode.java jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/qom/QomTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1412128r1=1412127r2=1412128view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Nov 21 14:34:36 2012 @@ -23,6 +23,7 @@ import java.util.List; import org.apache.jackrabbit.oak.api.PropertyValue; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; +import org.apache.jackrabbit.oak.namepath.JcrPathParser; import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.query.ast.AstVisitorBase; import org.apache.jackrabbit.oak.query.ast.BindVariableValueImpl; @@ -605,6 +606,17 @@ public class Query { public Tree getTree(String path) { return root.getTree(path); } + +/** + * Validate a path is syntactically correct. + * + * @param path the path to validate + */ +public void validatePath(String path) { +if (!JcrPathParser.validate(path)) { +throw new IllegalArgumentException(Invalid path: + path); +} +} @Override public String toString() { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1412128r1=1412127r2=1412128view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Wed Nov 21 14:34:36 2012 @@ -43,15 +43,15 @@ import java.util.ArrayList; import java.util.HashMap; /** - * The SQL2 parser can convert a JCR-SQL2 query to a query. - * The 'old' SQL query language is also supported if + * The SQL2 parser can convert a JCR-SQL2 query to a query. The 'old' SQL query + * language (here named SQL-1) is also supported. */ public class SQL2Parser { // Character types, used during the tokenizer phase private static final int CHAR_END = -1, CHAR_VALUE = 2, CHAR_QUOTED = 3; private static final int CHAR_NAME = 4, CHAR_SPECIAL_1 = 5, CHAR_SPECIAL_2 = 6; -private static final int CHAR_STRING = 7, CHAR_DECIMAL = 8; +private static final int CHAR_STRING = 7, CHAR_DECIMAL = 8, CHAR_BRACKETED = 9; // Token types private static final int KEYWORD = 1, IDENTIFIER = 2, PARAMETER = 3, END = 4, VALUE = 5; @@ -182,30 +182,17 @@ public class SQL2Parser { } private String readName() throws ParseException { -if (readIf([)) { -if (currentTokenType == VALUE) { -PropertyValue value = readString(); -read(]); -return value.getValue(Type.STRING); -} else { -int level = 1; -StringBuilder buff = new StringBuilder(); -while (true) { -if (isToken(])) { -if (--level = 0) { -read(); -break; -} -} else if (isToken([)) { -level++; -} -buff.append(readAny()); -} -return buff.toString(); -} +if (currentTokenType
svn commit: r1412513 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java
Author: thomasm Date: Thu Nov 22 11:59:39 2012 New Revision: 1412513 URL: http://svn.apache.org/viewvc?rev=1412513view=rev Log: JCR-3460 PropertyIndex uses TraversingCursor but should not Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java?rev=1412513r1=1412512r2=1412513view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java Thu Nov 22 11:59:39 2012 @@ -139,11 +139,10 @@ public class PropertyIndex implements Qu } } -if (paths != null) { -return Cursors.newPathCursor(paths); -} else { -return Cursors.newTraversingCursor(filter, root); +if (paths == null) { +throw new IllegalStateException(Property index is used even when no index is available for filter + filter); } +return Cursors.newPathCursor(paths); } @Override
svn commit: r1412514 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java
Author: thomasm Date: Thu Nov 22 12:04:53 2012 New Revision: 1412514 URL: http://svn.apache.org/viewvc?rev=1412514view=rev Log: JCR-3460 PropertyIndex uses TraversingCursor but should not Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java?rev=1412514r1=1412513r2=1412514view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java Thu Nov 22 12:04:53 2012 @@ -67,7 +67,8 @@ class NodeTypeIndex implements QueryInde public Cursor query(Filter filter, NodeState root) { NodeTypeIndexLookup lookup = new NodeTypeIndexLookup(root); if (!hasNodeTypeRestriction(filter) || !lookup.isIndexed(filter.getPath())) { -return Cursors.newTraversingCursor(filter, root); +throw new IllegalStateException( +NodeType index is used even when no index is available for filter + filter); } return Cursors.newPathCursor(lookup.find( resolveNodeType(root, filter.getNodeType(;
svn commit: r1412572 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
Author: thomasm Date: Thu Nov 22 14:56:20 2012 New Revision: 1412572 URL: http://svn.apache.org/viewvc?rev=1412572view=rev Log: OAK-308 NodeIterator limit and offset don't work as expected Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1412572r1=1412571r2=1412572view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Thu Nov 22 14:56:20 2012 @@ -331,7 +331,8 @@ public class Query { // rows in the same order // avoid overflow (both offset and limit could be Long.MAX_VALUE) -int keep = (int) (Math.min(Integer.MAX_VALUE, offset) + +int keep = (int) Math.min(Integer.MAX_VALUE, +Math.min(Integer.MAX_VALUE, offset) + Math.min(Integer.MAX_VALUE, limit)); ArrayListResultRowImpl list = new ArrayListResultRowImpl();
svn commit: r1412613 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property: PropertyIndexDiff.java PropertyIndexHookProvider.java PropertyIndexLookup.java
Author: thomasm Date: Thu Nov 22 16:38:20 2012 New Revision: 1412613 URL: http://svn.apache.org/viewvc?rev=1412613view=rev Log: JCR-3462 Documentation for the PropertyIndex Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexDiff.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexHookProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexUpdate.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexDiff.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexDiff.java?rev=1412613r1=1412612r2=1412613view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexDiff.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexDiff.java Thu Nov 22 16:38:20 2012 @@ -41,7 +41,10 @@ import org.apache.jackrabbit.oak.spi.sta /** * {@link IndexHook} implementation that is responsible for keeping the - * {@link PropertyIndex} up to date + * {@link PropertyIndex} up to date. + * p + * There is a tree of PropertyIndexDiff objects, each object represents the + * changes at a given node. * * @see PropertyIndex * @see PropertyIndexLookup @@ -49,14 +52,30 @@ import org.apache.jackrabbit.oak.spi.sta */ class PropertyIndexDiff implements IndexHook { +/** + * The parent (null if this is the root node). + */ private final PropertyIndexDiff parent; +/** + * The node (never null). + */ private final NodeBuilder node; +/** + * The node name (the path element). Null for the root node. + */ private final String name; +/** + * The path of the changed node (built lazily). + */ private String path; +/** + * Key: the property name. Value: the list of indexes (it is possible to + * have multiple indexes for the same property name). + */ private final MapString, ListPropertyIndexUpdate updates; private PropertyIndexDiff( @@ -98,13 +117,21 @@ class PropertyIndexDiff implements Index } } +@Override public String getPath() { -if (path == null) { // = parent != null +// build the path lazily +if (path == null) { path = concat(parent.getPath(), name); } return path; } +/** + * Get all the indexes for the given property name. + * + * @param name the property name + * @return the indexes + */ private IterablePropertyIndexUpdate getIndexes(String name) { ListPropertyIndexUpdate indexes = updates.get(name); if (indexes != null) { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexHookProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexHookProvider.java?rev=1412613r1=1412612r2=1412613view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexHookProvider.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexHookProvider.java Thu Nov 22 16:38:20 2012 @@ -29,7 +29,7 @@ import org.apache.jackrabbit.oak.spi.sta import com.google.common.collect.ImmutableList; /** - * Service that provides PropertyIndex based IndexHooks + * Service that provides PropertyIndex based IndexHooks. * * @see PropertyIndexDiff * @see IndexHookProvider Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java?rev=1412613r1=1412612r2=1412613view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java Thu Nov 22 16:38:20 2012
svn commit: r1416548 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: query/ast/ spi/query/
Author: thomasm Date: Mon Dec 3 14:42:25 2012 New Revision: 1416548 URL: http://svn.apache.org/viewvc?rev=1416548view=rev Log: OAK-473 Query tck test NodeNameTest fix Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java?rev=1416548r1=1416547r2=1416548view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java Mon Dec 3 14:42:25 2012 @@ -18,6 +18,8 @@ */ package org.apache.jackrabbit.oak.query.ast; +import javax.jcr.PropertyType; + import org.apache.jackrabbit.oak.api.PropertyValue; @@ -50,5 +52,11 @@ public class BindVariableValueImpl exten PropertyValue currentValue() { return query.getBindVariableValue(bindVariableName); } + +@Override +int getPropertyType() { +PropertyValue v = currentValue(); +return v == null ? PropertyType.UNDEFINED : v.getType().tag(); +} } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java?rev=1416548r1=1416547r2=1416548view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java Mon Dec 3 14:42:25 2012 @@ -18,6 +18,8 @@ */ package org.apache.jackrabbit.oak.query.ast; +import javax.jcr.PropertyType; + import org.apache.jackrabbit.oak.api.PropertyValue; import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.query.index.FilterImpl; @@ -135,9 +137,16 @@ public class ComparisonImpl extends Cons @Override public void restrict(FilterImpl f) { PropertyValue v = operand2.currentValue(); +if (!PropertyValues.canConvert( +operand2.getPropertyType(), +operand1.getPropertyType())) { +throw new IllegalArgumentException( +Unsupported conversion from property type + + PropertyType.nameFromValue(operand2.getPropertyType()) + + to property type + + PropertyType.nameFromValue(operand1.getPropertyType())); +} if (v != null) { - // operand1.restrict(f, operator, v); -// TODO OAK-347 if (operator == Operator.LIKE) { String pattern; pattern = v.getValue(Type.STRING); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java?rev=1416548r1=1416547r2=1416548view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java (original) +++ jackrabbit/oak
svn commit: r1416970 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinCondition
Author: thomasm Date: Tue Dec 4 14:47:10 2012 New Revision: 1416970 URL: http://svn.apache.org/viewvc?rev=1416970view=rev Log: OAK-475 Query tck test SameNodeJoinConditionTest failing with ParseException Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1416970r1=1416969r2=1416970view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Tue Dec 4 14:47:10 2012 @@ -232,9 +232,8 @@ public class SQL2Parser { read(,); String selector2 = readName(); if (readIf(,)) { -c = factory.sameNodeJoinCondition(selector1, selector2, readAbsolutePath()); +c = factory.sameNodeJoinCondition(selector1, selector2, readPath()); } else { -// TODO verify . is correct c = factory.sameNodeJoinCondition(selector1, selector2, .); } } else if (ISCHILDNODE.equalsIgnoreCase(name)) { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java?rev=1416970r1=1416969r2=1416970view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java Tue Dec 4 14:47:10 2012 @@ -18,6 +18,7 @@ */ package org.apache.jackrabbit.oak.query.ast; +import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.query.index.FilterImpl; import org.apache.jackrabbit.oak.spi.query.Filter; @@ -68,18 +69,33 @@ public class SameNodeJoinConditionImpl e public boolean evaluate() { String p1 = selector1.currentPath(); String p2 = selector2.currentPath(); -return p1.equals(p2); +// TODO normalize paths; support more complex relative path (.. and so on) +if (selector2Path.equals(.)) { +return p1.equals(p2); +} +String p = PathUtils.concat(p2, selector2Path); +return p.equals(p1); } @Override public void restrict(FilterImpl f) { if (f.getSelector() == selector1) { String p2 = selector2.currentPath(); -f.restrictPath(p2, Filter.PathRestriction.EXACT); +if (selector2Path.equals(.)) { +f.restrictPath(p2, Filter.PathRestriction.EXACT); +} else { +// TODO normalize paths; support more complex relative path (.. and so on) +String p = PathUtils.concat(p2, selector2Path); +f.restrictPath(p, Filter.PathRestriction.EXACT); +} } if (f.getSelector() == selector2) { -String p1 = selector1.currentPath(); -f.restrictPath(p1, Filter.PathRestriction.EXACT); +if (selector2Path.equals(.)) { +String p1 = selector1.currentPath(); +f.restrictPath(p1, Filter.PathRestriction.EXACT); +} else { +// TODO normalize paths; support relative path (.. and so on) +} } } Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1416970r1=1416969r2=1416970view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Dec 4 14:47:10 2012 @@ -202,12 +202,6 @@ org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType !-- OAK-323 -- org.apache.jackrabbit.test.api.query.GetPropertyNamesTest#testGetPropertyNames !-- OAK-323 -- org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType !-- OAK-476 -- - org.apache.jackrabbit.test.api.query.qom.SameNodeJoinConditionTest#testInnerJoin !-- OAK-475
svn commit: r1417002 - /jackrabbit/oak/trunk/oak-jcr/pom.xml
Author: thomasm Date: Tue Dec 4 15:49:46 2012 New Revision: 1417002 URL: http://svn.apache.org/viewvc?rev=1417002view=rev Log: OAK-475 Query tck test SameNodeJoinConditionTest failing with ParseException Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1417002r1=1417001r2=1417002view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Dec 4 15:49:46 2012 @@ -202,6 +202,7 @@ org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType !-- OAK-323 -- org.apache.jackrabbit.test.api.query.GetPropertyNamesTest#testGetPropertyNames !-- OAK-323 -- org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType !-- OAK-476 -- + org.apache.jackrabbit.test.api.query.qom.SameNodeJoinConditionTest#testRightOuterJoinWithPath !-- OAK-475 -- org.apache.jackrabbit.test.api.observation.EventTest#testGetUserId org.apache.jackrabbit.test.api.observation.NodeMovedTest#testMoveNode org.apache.jackrabbit.test.api.observation.NodeMovedTest#testMoveTree
svn commit: r1417349 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java oak-jcr/pom.xml
Author: thomasm Date: Wed Dec 5 10:50:09 2012 New Revision: 1417349 URL: http://svn.apache.org/viewvc?rev=1417349view=rev Log: OAK-475 Query tck test SameNodeJoinConditionTest failing with ParseException Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java jackrabbit/oak/trunk/oak-jcr/pom.xml Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java?rev=1417349r1=1417348r2=1417349view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java Wed Dec 5 10:50:09 2012 @@ -81,20 +81,24 @@ public class SameNodeJoinConditionImpl e public void restrict(FilterImpl f) { if (f.getSelector() == selector1) { String p2 = selector2.currentPath(); -if (selector2Path.equals(.)) { -f.restrictPath(p2, Filter.PathRestriction.EXACT); -} else { -// TODO normalize paths; support more complex relative path (.. and so on) -String p = PathUtils.concat(p2, selector2Path); -f.restrictPath(p, Filter.PathRestriction.EXACT); +if (p2 != null) { +if (selector2Path.equals(.)) { +f.restrictPath(p2, Filter.PathRestriction.EXACT); +} else { +// TODO normalize paths; support more complex relative path (.. and so on) +String p = PathUtils.concat(p2, selector2Path); +f.restrictPath(p, Filter.PathRestriction.EXACT); +} } } if (f.getSelector() == selector2) { -if (selector2Path.equals(.)) { -String p1 = selector1.currentPath(); -f.restrictPath(p1, Filter.PathRestriction.EXACT); -} else { -// TODO normalize paths; support relative path (.. and so on) +String p1 = selector1.currentPath(); +if (p1 != null) { +if (selector2Path.equals(.)) { +f.restrictPath(p1, Filter.PathRestriction.EXACT); +} else { +// TODO normalize paths; support relative path (.. and so on) +} } } } Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1417349r1=1417348r2=1417349view=diff == --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Wed Dec 5 10:50:09 2012 @@ -202,7 +202,6 @@ org.apache.jackrabbit.test.api.query.qom.ColumnTest#testExpandColumnsForNodeType !-- OAK-323 -- org.apache.jackrabbit.test.api.query.GetPropertyNamesTest#testGetPropertyNames !-- OAK-323 -- org.apache.jackrabbit.test.api.query.qom.SelectorTest#testUnknownNodeType !-- OAK-476 -- - org.apache.jackrabbit.test.api.query.qom.SameNodeJoinConditionTest#testRightOuterJoinWithPath !-- OAK-475 -- org.apache.jackrabbit.test.api.observation.EventTest#testGetUserId org.apache.jackrabbit.test.api.observation.NodeMovedTest#testMoveNode org.apache.jackrabbit.test.api.observation.NodeMovedTest#testMoveTree
svn commit: r1417455 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: query/index/IndexRowImpl.java spi/query/IndexRow.java
Author: thomasm Date: Wed Dec 5 14:48:33 2012 New Revision: 1417455 URL: http://svn.apache.org/viewvc?rev=1417455view=rev Log: OAK-376 Internal class PropertyValue exposed through Oak API (PropertyValue is now in the oak API) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java?rev=1417455r1=1417454r2=1417455view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java Wed Dec 5 14:48:33 2012 @@ -18,8 +18,8 @@ */ package org.apache.jackrabbit.oak.query.index; +import org.apache.jackrabbit.oak.api.PropertyValue; import org.apache.jackrabbit.oak.spi.query.IndexRow; -import org.apache.jackrabbit.oak.spi.query.PropertyStateValue; /** * A simple index row implementation. @@ -38,7 +38,7 @@ public class IndexRowImpl implements Ind } @Override -public PropertyStateValue getValue(String columnName) { +public PropertyValue getValue(String columnName) { return null; } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java?rev=1417455r1=1417454r2=1417455view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java Wed Dec 5 14:48:33 2012 @@ -18,8 +18,7 @@ */ package org.apache.jackrabbit.oak.spi.query; - -import org.apache.jackrabbit.oak.spi.query.PropertyStateValue; +import org.apache.jackrabbit.oak.api.PropertyValue; /** * A row returned by the index. @@ -41,6 +40,6 @@ public interface IndexRow { * @param columnName the column name * @return the value, or null if not available */ -PropertyStateValue getValue(String columnName); +PropertyValue getValue(String columnName); }
svn commit: r1417488 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/
Author: thomasm Date: Wed Dec 5 15:40:04 2012 New Revision: 1417488 URL: http://svn.apache.org/viewvc?rev=1417488view=rev Log: OAK-320 Query: ability to disable/enable literals in queries to protect against code injection Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1417488r1=1417487r2=1417488view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Wed Dec 5 15:40:04 2012 @@ -42,6 +42,8 @@ public class QueryEngineImpl { static final String SQL = sql; static final String XPATH = xpath; static final String JQOM = JCR-JQOM; + +static final String NO_LITERALS = -noLiterals; private static final Logger LOG = LoggerFactory.getLogger(QueryEngineImpl.class); @@ -54,7 +56,8 @@ public class QueryEngineImpl { } public ListString getSupportedQueryLanguages() { -return Arrays.asList(SQL2, SQL, XPATH, JQOM); +return Arrays.asList(SQL2, SQL, XPATH, JQOM, +SQL2 + NO_LITERALS, SQL + NO_LITERALS, XPATH + NO_LITERALS); } /** @@ -75,17 +78,20 @@ public class QueryEngineImpl { if (LOG.isDebugEnabled()) { LOG.debug(language + : + statement); } +SQL2Parser parser = new SQL2Parser(); +if (language.endsWith(NO_LITERALS)) { +language = language.substring(0, language.length() - NO_LITERALS.length()); +parser.setAllowNumberLiterals(false); +parser.setAllowTextLiterals(false); +} if (SQL2.equals(language) || JQOM.equals(language)) { -SQL2Parser parser = new SQL2Parser(); q = parser.parse(statement); } else if (SQL.equals(language)) { -SQL2Parser parser = new SQL2Parser(); parser.setSupportSQL1(true); q = parser.parse(statement); } else if (XPATH.equals(language)) { XPathToSQL2Converter converter = new XPathToSQL2Converter(); String sql2 = converter.convert(statement); -SQL2Parser parser = new SQL2Parser(); if (LOG.isDebugEnabled()) { LOG.debug(XPath SQL2: + sql2); } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1417488r1=1417487r2=1417488view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Wed Dec 5 15:40:04 2012 @@ -35,6 +35,8 @@ import org.apache.jackrabbit.oak.query.a import org.apache.jackrabbit.oak.query.ast.SourceImpl; import org.apache.jackrabbit.oak.query.ast.StaticOperandImpl; import org.apache.jackrabbit.oak.spi.query.PropertyValues; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.jcr.PropertyType; import java.math.BigDecimal; @@ -47,6 +49,8 @@ import java.util.HashMap; * language (here named SQL-1) is also supported. */ public class SQL2Parser { + +private static final Logger LOG = LoggerFactory.getLogger(SQL2Parser.class); // Character types, used during the tokenizer phase private static final int CHAR_END = -1, CHAR_VALUE = 2, CHAR_QUOTED = 3; @@ -1031,13 +1035,18 @@ public class SQL2Parser { i++; } currentToken = '; -checkLiterals(false); +if (end != ']') { +checkLiterals(false); +} currentValue = PropertyValues.newString(result); parseIndex = i; currentTokenType = VALUE; } private void checkLiterals(boolean text) throws ParseException { +if (LOG.isDebugEnabled()) { +LOG.debug(Literal used in query: + statement); +} if (text !allowTextLiterals || !text !allowNumberLiterals) { throw getSyntaxError(bind variable (literals of this type not allowed)); } Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java URL: http
svn commit: r1417514 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java
Author: thomasm Date: Wed Dec 5 16:32:07 2012 New Revision: 1417514 URL: http://svn.apache.org/viewvc?rev=1417514view=rev Log: OAK-484 QueryResultTest failing Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java?rev=1417514r1=1417513r2=1417514view=diff == --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java Wed Dec 5 16:32:07 2012 @@ -91,10 +91,16 @@ public class PropertyStateValue implemen return Integer.signum(p2.getType().tag() - getType().tag()); } switch (getType().tag()) { -case PropertyType.BINARY: -return compare(getValue(Type.BINARIES), p2.getValue(Type.BINARIES)); +case PropertyType.BOOLEAN: +return compare(getValue(Type.BOOLEANS), p2.getValue(Type.BOOLEANS)); +case PropertyType.DECIMAL: +return compare(getValue(Type.DECIMALS), p2.getValue(Type.DECIMALS)); case PropertyType.DOUBLE: return compare(getValue(Type.DOUBLES), p2.getValue(Type.DOUBLES)); +case PropertyType.LONG: +return compare(getValue(Type.LONGS), p2.getValue(Type.LONGS)); +case PropertyType.BINARY: +return compare(getValue(Type.BINARIES), p2.getValue(Type.BINARIES)); case PropertyType.DATE: return compareAsDate(getValue(Type.STRINGS), p2.getValue(Type.STRINGS));