You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/04/14 15:54:23 UTC
svn commit: r647798 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/query/lucene/
test/java/org/apache/jackrabbit/core/query/qom/
Author: mreutegg
Date: Mon Apr 14 06:54:14 2008
New Revision: 647798
URL: http://svn.apache.org/viewvc?rev=647798&view=rev
Log:
JCR-1104: JSR 283 support (work in progress)
- NodeLocalName
Added:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java (with props)
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java (with props)
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java (with props)
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java (with props)
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildNodesQueryHits.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DescendantSelfAxisQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexFormatVersion.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllDocsQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PropertiesSynonymProvider.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SimilarityQuery.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeNameTest.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/TestAll.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java Mon Apr 14 06:54:14 2008
@@ -183,9 +183,7 @@
if (cause instanceof IOException) {
ex = (IOException) cause;
} else {
- IOException e = new IOException();
- e.initCause(cause);
- ex = e;
+ throw Util.createIOException(cause);
}
} else {
// all others are logged
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java Mon Apr 14 06:54:14 2008
@@ -37,7 +37,6 @@
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.Similarity;
-import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.Weight;
import org.apache.lucene.search.Sort;
@@ -68,7 +67,7 @@
* The nameTest to apply on the child axis, or <code>null</code> if all
* child nodes should be selected.
*/
- private final String nameTest;
+ private final Name nameTest;
/**
* The context position for the selected child node, or
@@ -77,6 +76,16 @@
private final int position;
/**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * The internal namespace mappings.
+ */
+ private final NamespaceMappings nsMappings;
+
+ /**
* The scorer of the context query
*/
private Scorer contextScorer;
@@ -94,9 +103,15 @@
* @param context the context for this query.
* @param nameTest a name test or <code>null</code> if any child node is
* selected.
+ * @param version the index format version.
+ * @param nsMappings the internal namespace mappings.
*/
- ChildAxisQuery(ItemStateManager itemMgr, Query context, String nameTest) {
- this(itemMgr, context, nameTest, LocationStepQueryNode.NONE);
+ ChildAxisQuery(ItemStateManager itemMgr,
+ Query context,
+ Name nameTest,
+ IndexFormatVersion version,
+ NamespaceMappings nsMappings) {
+ this(itemMgr, context, nameTest, LocationStepQueryNode.NONE, version, nsMappings);
}
/**
@@ -110,12 +125,21 @@
* @param position the context position of the child node to select. If
* <code>position</code> is {@link LocationStepQueryNode#NONE}, the context
* position of the child node is not checked.
+ * @param version the index format version.
+ * @param nsMapping the internal namespace mappings.
*/
- ChildAxisQuery(ItemStateManager itemMgr, Query context, String nameTest, int position) {
+ ChildAxisQuery(ItemStateManager itemMgr,
+ Query context,
+ Name nameTest,
+ int position,
+ IndexFormatVersion version,
+ NamespaceMappings nsMapping) {
this.itemMgr = itemMgr;
this.contextQuery = context;
this.nameTest = nameTest;
this.position = position;
+ this.version = version;
+ this.nsMappings = nsMapping;
}
/**
@@ -136,7 +160,7 @@
/**
* @return the name test or <code>null</code> if none was specified.
*/
- String getNameTest() {
+ Name getNameTest() {
return nameTest;
}
@@ -179,7 +203,7 @@
if (nameTest == null) {
sub = new MatchAllDocsQuery();
} else {
- sub = new TermQuery(new Term(FieldNames.LABEL, nameTest));
+ sub = new NameQuery(nameTest, version, nsMappings);
}
return new DescendantSelfAxisQuery(dsaq.getContextQuery(),
sub, dsaq.getMinLevels() + 1).rewrite(reader);
@@ -191,7 +215,8 @@
if (cQuery == contextQuery) {
return this;
} else {
- return new ChildAxisQuery(itemMgr, cQuery, nameTest, position);
+ return new ChildAxisQuery(itemMgr, cQuery, nameTest,
+ position, version, nsMappings);
}
}
@@ -283,7 +308,7 @@
public Scorer scorer(IndexReader reader) throws IOException {
contextScorer = contextQuery.weight(searcher).scorer(reader);
if (nameTest != null) {
- nameTestScorer = new TermQuery(new Term(FieldNames.LABEL, nameTest)).weight(searcher).scorer(reader);
+ nameTestScorer = new NameQuery(nameTest, version, nsMappings).weight(searcher).scorer(reader);
}
return new ChildAxisScorer(searcher.getSimilarity(),
reader, (HierarchyResolver) reader);
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildNodesQueryHits.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildNodesQueryHits.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildNodesQueryHits.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ChildNodesQueryHits.java Mon Apr 14 06:54:14 2008
@@ -99,9 +99,7 @@
Node parent = session.getNodeById(nextParent.getNodeId());
childHits = new NodeTraversingQueryHits(parent, false, 1);
} catch (RepositoryException e) {
- IOException ex = new IOException(e.getMessage());
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
} else {
childHits = null;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java Mon Apr 14 06:54:14 2008
@@ -25,8 +25,8 @@
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.Similarity;
-import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.Weight;
+import org.apache.jackrabbit.spi.Name;
import java.io.IOException;
import java.util.ArrayList;
@@ -55,7 +55,17 @@
* The nameTest to apply on target node, or <code>null</code> if all
* target nodes should be selected.
*/
- private final String nameTest;
+ private final Name nameTest;
+
+ /**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * The internal namespace mappings.
+ */
+ private final NamespaceMappings nsMappings;
/**
* The scorer of the context query
@@ -75,11 +85,16 @@
* @param refProperty the name of the reference property.
* @param nameTest a name test or <code>null</code> if any node is
* selected.
+ * @param version the index format version.
+ * @param nsMappings the namespace mappings.
*/
- DerefQuery(Query context, String refProperty, String nameTest) {
+ DerefQuery(Query context, String refProperty, Name nameTest,
+ IndexFormatVersion version, NamespaceMappings nsMappings) {
this.contextQuery = context;
this.refProperty = refProperty;
this.nameTest = nameTest;
+ this.version = version;
+ this.nsMappings = nsMappings;
}
/**
@@ -117,7 +132,7 @@
if (cQuery == contextQuery) {
return this;
} else {
- return new DerefQuery(cQuery, refProperty, nameTest);
+ return new DerefQuery(cQuery, refProperty, nameTest, version, nsMappings);
}
}
@@ -182,7 +197,7 @@
public Scorer scorer(IndexReader reader) throws IOException {
contextScorer = contextQuery.weight(searcher).scorer(reader);
if (nameTest != null) {
- nameTestScorer = new TermQuery(new Term(FieldNames.LABEL, nameTest)).weight(searcher).scorer(reader);
+ nameTestScorer = new NameQuery(nameTest, version, nsMappings).weight(searcher).scorer(reader);
}
return new DerefScorer(searcher.getSimilarity(), reader);
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DescendantSelfAxisQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DescendantSelfAxisQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DescendantSelfAxisQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DescendantSelfAxisQuery.java Mon Apr 14 06:54:14 2008
@@ -233,9 +233,7 @@
startingPoints.put(node.getPath(), sn);
}
} catch (RepositoryException e) {
- IOException ex = new IOException(e.getMessage());
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
} finally {
result.close();
@@ -293,9 +291,7 @@
currentTraversal = new NodeTraversingQueryHits(node,
getMinLevels() == 0);
} catch (RepositoryException e) {
- IOException ex = new IOException(e.getMessage());
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
} else {
currentTraversal = null;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java Mon Apr 14 06:54:14 2008
@@ -58,6 +58,18 @@
public static final String LABEL = "_:LABEL".intern();
/**
+ * Name of the field that contains the local name of the node. Terms are not
+ * tokenized.
+ */
+ public static final String LOCAL_NAME = "_:LOCAL_NAME".intern();
+
+ /**
+ * Name of the field that contains the namespace URI of the node name. Terms
+ * are not tokenized.
+ */
+ public static final String NAMESPACE_URI = "_:NAMESPACE_URI".intern();
+
+ /**
* Name of the field that contains the names of multi-valued properties that
* hold more than one value. Terms are not tokenized and not stored, only
* indexed.
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexFormatVersion.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexFormatVersion.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexFormatVersion.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexFormatVersion.java Mon Apr 14 06:54:14 2008
@@ -17,12 +17,8 @@
package org.apache.jackrabbit.core.query.lucene;
import java.util.Collection;
-import java.io.IOException;
import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.TermPositions;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermEnum;
/**
* This class indicates the lucene index format that is used.
@@ -34,8 +30,9 @@
* adds a <code>PROPERTIES_SET</code> field which contains all property names of
* a node. This speeds up queries that check the existence of a property.</li>
* <li><b>Version 3</b> is the index format introduced with Jackrabbit 1.5.x. It
- * adds support for length queries using the newly added
- * <code>PROPERTY_LENGTHS</code> field. Furthermore a Payload is added to
+ * adds support for length and local name queries using the newly added
+ * fields <code>PROPERTY_LENGTHS</code>, <code>LOCAL_NAME</code> and
+ * <code>NAMESPACE_URI</code>. Furthermore a Payload is added to
* <code>PROPERTIES</code> fields to indicate the property type.</li>
* </ul>
* Please note that existing indexes are not automatically upgraded to a newer
@@ -92,44 +89,15 @@
* @return the index format version of the index used by the given
* index reader.
*/
- public static IndexFormatVersion getVersion(IndexReader indexReader)
- throws IOException {
+ public static IndexFormatVersion getVersion(IndexReader indexReader) {
Collection fields = indexReader.getFieldNames(
IndexReader.FieldOption.ALL);
- if (hasPayloads(indexReader) || indexReader.numDocs() == 0) {
+ if (fields.contains(FieldNames.LOCAL_NAME) || indexReader.numDocs() == 0) {
return IndexFormatVersion.V3;
} else if (fields.contains(FieldNames.PROPERTIES_SET)) {
return IndexFormatVersion.V2;
} else {
return IndexFormatVersion.V1;
}
- }
-
- /**
- * @param reader the index reader.
- * @return <code>true</code> if the {@link FieldNames#PROPERTIES} fields
- * contain payloads; <code>false</code> otherwise.
- * @throws IOException if an error occurs while reading from the index.
- */
- public static boolean hasPayloads(IndexReader reader) throws IOException {
- TermPositions tp = reader.termPositions();
- try {
- TermEnum terms = reader.terms(
- new Term(FieldNames.PROPERTIES, ""));
- try {
- do {
- tp.seek(terms);
- if (tp.next()) {
- tp.nextPosition();
- return tp.isPayloadAvailable();
- }
- } while (terms.next() && terms.term().field() == FieldNames.PROPERTIES);
- } finally {
- terms.close();
- }
- } finally {
- tp.close();
- }
- return false;
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java Mon Apr 14 06:54:14 2008
@@ -239,9 +239,7 @@
out.close();
out = null;
}
- IOException ex = new IOException(e.getMessage());
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
}
return out;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java Mon Apr 14 06:54:14 2008
@@ -467,9 +467,50 @@
return transformCase(obj, data, false);
}
- public Object visit(NodeLocalNameImpl node, Object data) {
- // TODO: implement
- throw new UnsupportedOperationException("not yet implemented");
+ public Object visit(NodeLocalNameImpl node, Object data) throws Exception {
+ if (version.getVersion() < IndexFormatVersion.V3.getVersion()) {
+ throw new InvalidQueryException("NodeLocalName operand is only " +
+ "available with index version >= 3. Please re-index " +
+ "repository and execute query again.");
+ }
+ if (data instanceof ComparisonImpl) {
+ ComparisonImpl comp = ((ComparisonImpl) data);
+ int operator = comp.getOperator();
+ Value v = (Value) ((StaticOperandImpl) comp.getOperand2()).accept(this, data);
+ String value = v.getString();
+
+ switch (operator) {
+ case OPERATOR_EQUAL_TO:
+ return new TermQuery(new Term(FieldNames.LOCAL_NAME, value));
+ case OPERATOR_GREATER_THAN:
+ return new LocalNameRangeQuery(value, null, false);
+ case OPERATOR_GREATER_THAN_OR_EQUAL_TO:
+ return new LocalNameRangeQuery(value, null, true);
+ case OPERATOR_LESS_THAN:
+ return new LocalNameRangeQuery(null, value, false);
+ case OPERATOR_LESS_THAN_OR_EQUAL_TO:
+ return new LocalNameRangeQuery(null, value, true);
+ case OPERATOR_LIKE:
+ if (value.equals("%")) {
+ return new MatchAllDocsQuery();
+ } else {
+ return new WildcardQuery(FieldNames.LOCAL_NAME, null, value);
+ }
+ case OPERATOR_NOT_EQUAL_TO:
+ MatchAllDocsQuery all = new MatchAllDocsQuery();
+ BooleanQuery b = new BooleanQuery();
+ b.add(all, BooleanClause.Occur.SHOULD);
+ b.add(new TermQuery(new Term(FieldNames.LOCAL_NAME, value)),
+ BooleanClause.Occur.MUST_NOT);
+ return b;
+ default:
+ throw new InvalidQueryException(
+ "Unknown operator " + operator);
+ }
+ } else {
+ // TODO
+ throw new InvalidQueryException("not yet implemented");
+ }
}
public Object visit(NodeNameImpl node, Object data) throws Exception {
@@ -497,43 +538,25 @@
throw new InvalidQueryException(v.getString() +
" cannot be converted into a NAME value");
}
- String stringValue = npResolver.getJCRName(value);
- // the prefix including colon
- String prefix = stringValue.substring(0, stringValue.indexOf(':') + 1);
switch (operator) {
case OPERATOR_EQUAL_TO:
- return new TermQuery(new Term(FieldNames.LABEL, stringValue));
+ return new NameQuery(value, version, nsMappings);
case OPERATOR_GREATER_THAN:
- Term lower = new Term(FieldNames.LABEL, stringValue);
- Term upper = new Term(FieldNames.LABEL,
- prefix + "\uFFFF");
- return new RangeQuery(lower, upper, false);
+ return new NameRangeQuery(value, null, false, version, nsMappings);
case OPERATOR_GREATER_THAN_OR_EQUAL_TO:
- lower = new Term(FieldNames.LABEL, stringValue);
- upper = new Term(FieldNames.LABEL,
- prefix + "\uFFFF");
- return new RangeQuery(lower, upper, true);
+ return new NameRangeQuery(value, null, true, version, nsMappings);
case OPERATOR_LESS_THAN:
- lower = new Term(FieldNames.LABEL, prefix);
- upper = new Term(FieldNames.LABEL, stringValue);
- return new RangeQuery(lower, upper, false);
+ return new NameRangeQuery(null, value, false, version, nsMappings);
case OPERATOR_LESS_THAN_OR_EQUAL_TO:
- lower = new Term(FieldNames.LABEL, prefix);
- upper = new Term(FieldNames.LABEL, stringValue);
- return new RangeQuery(lower, upper, true);
+ return new NameRangeQuery(null, value, true, version, nsMappings);
case OPERATOR_LIKE:
- if (stringValue.equals("%")) {
- return new MatchAllDocsQuery();
- } else {
- return new WildcardQuery(FieldNames.LABEL,
- null, stringValue);
- }
+ throw new InvalidQueryException("Operator LIKE is not supported with NAME operands");
case OPERATOR_NOT_EQUAL_TO:
MatchAllDocsQuery all = new MatchAllDocsQuery();
BooleanQuery b = new BooleanQuery();
b.add(all, BooleanClause.Occur.SHOULD);
- b.add(new TermQuery(new Term(FieldNames.LABEL, stringValue)),
+ b.add(new NameQuery(value, version, nsMappings),
BooleanClause.Occur.MUST_NOT);
return b;
default:
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java?rev=647798&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java Mon Apr 14 06:54:14 2008
@@ -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.core.query.lucene;
+
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * <code>LocalNameQuery</code> implements a query for the local name of a node.
+ */
+public class LocalNameQuery extends Query {
+
+ /**
+ * The local name of a node.
+ */
+ private final String localName;
+
+ /**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * Creates a new <code>LocalNameQuery</code> for the given
+ * <code>localName</code>.
+ *
+ * @param localName the local name of a node.
+ * @param version the version of the index.
+ */
+ public LocalNameQuery(String localName, IndexFormatVersion version) {
+ this.localName = localName;
+ this.version = version;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Query rewrite(IndexReader reader) throws IOException {
+ if (version.getVersion() >= IndexFormatVersion.V3.getVersion()) {
+ return new TermQuery(new Term(FieldNames.LOCAL_NAME, localName));
+ } else {
+ throw new IOException("LocalNameQuery requires IndexFormatVersion V3");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void extractTerms(Set terms) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString(String field) {
+ return "local-name() = " + localName;
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java?rev=647798&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java Mon Apr 14 06:54:14 2008
@@ -0,0 +1,72 @@
+/*
+ * 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.core.query.lucene;
+
+import org.apache.lucene.index.Term;
+
+/**
+ * <code>LocalNameRangeQuery</code> implements a range query on the local name
+ * of nodes.
+ */
+public class LocalNameRangeQuery extends RangeQuery {
+
+ /**
+ * Creates a new <code>LocalNameRangeQuery</code>. The lower or the upper
+ * bound may be null, but not both!
+ *
+ * @param lowerName the lower bound or <code>null</code>.
+ * @param upperName the upper bound or <code>null</code>.
+ * @param inclusive if bounds are inclusive.
+ */
+ public LocalNameRangeQuery(String lowerName,
+ String upperName,
+ boolean inclusive) {
+ super(getLowerTerm(lowerName), getUpperTerm(upperName), inclusive);
+ }
+
+ /**
+ * Creates a {@link Term} for the lower bound local name.
+ *
+ * @param lowerName the lower bound local name.
+ * @return a {@link Term} for the lower bound local name.
+ */
+ private static Term getLowerTerm(String lowerName) {
+ String text;
+ if (lowerName == null) {
+ text = "";
+ } else {
+ text = lowerName;
+ }
+ return new Term(FieldNames.LOCAL_NAME, text);
+ }
+
+ /**
+ * Creates a {@link Term} for the upper bound local name.
+ *
+ * @param upperName the upper bound local name.
+ * @return a {@link Term} for the upper bound local name.
+ */
+ private static Term getUpperTerm(String upperName) {
+ String text;
+ if (upperName == null) {
+ text = "\uFFFF";
+ } else {
+ text = upperName;
+ }
+ return new Term(FieldNames.LOCAL_NAME, text);
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LocalNameRangeQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java Mon Apr 14 06:54:14 2008
@@ -416,9 +416,9 @@
// text search on some child axis
Path.Element[] elements = relPath.getElements();
for (int i = elements.length - 1; i >= 0; i--) {
- String name = null;
+ Name name = null;
if (!elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
- name = resolver.getJCRName(elements[i].getName());
+ name = elements[i].getName();
}
// join text search with name test
// if path references property that's elements.length - 2
@@ -426,7 +426,7 @@
if (name != null
&& ((node.getReferencesProperty() && i == elements.length - 2)
|| (!node.getReferencesProperty() && i == elements.length - 1))) {
- Query q = new TermQuery(new Term(FieldNames.LABEL, name));
+ Query q = new NameQuery(name, indexFormatVersion, nsMappings);
BooleanQuery and = new BooleanQuery();
and.add(q, Occur.MUST);
and.add(context, Occur.MUST);
@@ -434,11 +434,13 @@
} else if ((node.getReferencesProperty() && i < elements.length - 2)
|| (!node.getReferencesProperty() && i < elements.length - 1)) {
// otherwise do a parent axis step
- context = new ParentAxisQuery(context, name);
+ context = new ParentAxisQuery(context, name,
+ indexFormatVersion, nsMappings);
}
}
// finally select parent
- context = new ParentAxisQuery(context, null);
+ context = new ParentAxisQuery(context, null,
+ indexFormatVersion, nsMappings);
}
return context;
} catch (NamespaceException e) {
@@ -465,15 +467,9 @@
} else {
// then this is a node != the root node
// will never match anything!
- String name = "";
- try {
- name = resolver.getJCRName(nameTest);
- } catch (NamespaceException e) {
- exceptions.add(e);
- }
BooleanQuery and = new BooleanQuery();
and.add(new TermQuery(new Term(FieldNames.PARENT, "")), Occur.MUST);
- and.add(new TermQuery(new Term(FieldNames.LABEL, name)), Occur.MUST);
+ and.add(new NameQuery(nameTest, indexFormatVersion, nsMappings), Occur.MUST);
context = and;
}
LocationStepQueryNode[] tmp = new LocationStepQueryNode[steps.length - 1];
@@ -526,15 +522,9 @@
}
}
- TermQuery nameTest = null;
+ NameQuery nameTest = null;
if (node.getNameTest() != null) {
- try {
- String internalName = resolver.getJCRName(node.getNameTest());
- nameTest = new TermQuery(new Term(FieldNames.LABEL, internalName));
- } catch (NamespaceException e) {
- // should never happen
- exceptions.add(e);
- }
+ nameTest = new NameQuery(node.getNameTest(), indexFormatVersion, nsMappings);
}
if (node.getIncludeDescendants()) {
@@ -564,7 +554,9 @@
andQuery.add(context, Occur.MUST);
} else {
context = new DescendantSelfAxisQuery(context, true);
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null, node.getIndex()), Occur.MUST);
+ andQuery.add(new ChildAxisQuery(sharedItemMgr,
+ context, null, node.getIndex(),
+ indexFormatVersion, nsMappings), Occur.MUST);
}
} else {
andQuery.add(new MatchAllDocsQuery(), Occur.MUST);
@@ -574,10 +566,14 @@
} else {
// name test
if (nameTest != null) {
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, nameTest.getTerm().text(), node.getIndex()), Occur.MUST);
+ andQuery.add(new ChildAxisQuery(sharedItemMgr, context,
+ nameTest.getName(), node.getIndex(), indexFormatVersion,
+ nsMappings), Occur.MUST);
} else {
// select child nodes
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null, node.getIndex()), Occur.MUST);
+ andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null,
+ node.getIndex(), indexFormatVersion, nsMappings),
+ Occur.MUST);
}
}
@@ -592,17 +588,14 @@
try {
String refProperty = resolver.getJCRName(node.getRefProperty());
- String nameTest = null;
- if (node.getNameTest() != null) {
- nameTest = resolver.getJCRName(node.getNameTest());
- }
if (node.getIncludeDescendants()) {
Query refPropQuery = Util.createMatchAllQuery(refProperty, indexFormatVersion);
context = new DescendantSelfAxisQuery(context, refPropQuery, false);
}
- context = new DerefQuery(context, refProperty, nameTest);
+ context = new DerefQuery(context, refProperty, node.getNameTest(),
+ indexFormatVersion, nsMappings);
// attach predicates
Object[] predicates = node.acceptOperands(this, data);
@@ -726,9 +719,7 @@
// parse string literal as JCR Name
try {
Name n = session.getQName(ISO9075.decode(node.getStringValue()));
- String translatedQName = nsMappings.translatePropertyName(n);
- Term t = new Term(FieldNames.LABEL, translatedQName);
- query = new TermQuery(t);
+ query = new NameQuery(n, indexFormatVersion, nsMappings);
} catch (NameException e) {
exceptions.add(e);
return data;
@@ -738,7 +729,7 @@
}
} else {
// will never match -> create dummy query
- query = new TermQuery(new Term(FieldNames.UUID, "x"));
+ query = new BooleanQuery();
}
} else {
switch (node.getOperation()) {
@@ -879,16 +870,17 @@
query = new NotQuery(Util.createMatchAllQuery(field, indexFormatVersion));
break;
case QueryConstants.OPERATION_SIMILAR:
- String uuid = "x";
try {
NodeId id = hmgr.resolveNodePath(session.getQPath(node.getStringValue()));
if (id != null) {
- uuid = id.getUUID().toString();
+ query = new SimilarityQuery(id.getUUID().toString(), analyzer);
+ } else {
+ query = new BooleanQuery();
}
} catch (Exception e) {
exceptions.add(e);
+ query = new BooleanQuery();
}
- query = new SimilarityQuery(uuid, analyzer);
break;
case QueryConstants.OPERATION_NOT_NULL:
query = Util.createMatchAllQuery(field, indexFormatVersion);
@@ -903,37 +895,35 @@
}
if (relPath.getLength() > 1) {
- try {
- // child axis in relation
- Path.Element[] elements = relPath.getElements();
- // elements.length - 1 = property name
- // elements.length - 2 = last child axis name test
- for (int i = elements.length - 2; i >= 0; i--) {
- String name = null;
- if (!elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
- name = resolver.getJCRName(elements[i].getName());
- }
- if (i == elements.length - 2) {
- // join name test with property query if there is one
- if (name != null) {
- Query nameTest = new TermQuery(new Term(FieldNames.LABEL, name));
- BooleanQuery and = new BooleanQuery();
- and.add(query, Occur.MUST);
- and.add(nameTest, Occur.MUST);
- query = and;
- } else {
- // otherwise the query can be used as is
- }
+ // child axis in relation
+ Path.Element[] elements = relPath.getElements();
+ // elements.length - 1 = property name
+ // elements.length - 2 = last child axis name test
+ for (int i = elements.length - 2; i >= 0; i--) {
+ Name name = null;
+ if (!elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
+ name = elements[i].getName();
+ }
+ if (i == elements.length - 2) {
+ // join name test with property query if there is one
+ if (name != null) {
+ Query nameTest = new NameQuery(name,
+ indexFormatVersion, nsMappings);
+ BooleanQuery and = new BooleanQuery();
+ and.add(query, Occur.MUST);
+ and.add(nameTest, Occur.MUST);
+ query = and;
} else {
- query = new ParentAxisQuery(query, name);
+ // otherwise the query can be used as is
}
+ } else {
+ query = new ParentAxisQuery(query, name,
+ indexFormatVersion, nsMappings);
}
- } catch (NamespaceException e) {
- // should never happen
- exceptions.add(e);
}
// finally select the parent of the selected nodes
- query = new ParentAxisQuery(query, null);
+ query = new ParentAxisQuery(query, null,
+ indexFormatVersion, nsMappings);
}
return query;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllDocsQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllDocsQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllDocsQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllDocsQuery.java Mon Apr 14 06:54:14 2008
@@ -41,9 +41,7 @@
return new NodeTraversingQueryHits(
session.getRootNode(), true);
} catch (RepositoryException e) {
- IOException ex = new IOException(e.getMessage());
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
} else {
return null;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Mon Apr 14 06:54:14 2008
@@ -265,9 +265,7 @@
fs.init();
store = new IndexingQueueStore(fs, INDEXING_QUEUE_FILE);
} catch (FileSystemException e) {
- IOException ex = new IOException();
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
// initialize indexing queue
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java?rev=647798&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java Mon Apr 14 06:54:14 2008
@@ -0,0 +1,111 @@
+/*
+ * 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.core.query.lucene;
+
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
+
+import javax.jcr.NamespaceException;
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * <code>NameQuery</code> implements a query for the name of a node.
+ */
+public class NameQuery extends Query {
+
+ /**
+ * The node name.
+ */
+ private final Name nodeName;
+
+ /**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * The internal namespace mappings of the index.
+ */
+ private final NamespaceMappings nsMappings;
+
+ /**
+ * Creates a new <code>NameQuery</code>.
+ *
+ * @param nodeName the name of the nodes to return.
+ * @param version the version of the index.
+ * @param nsMappings the namespace mappings of the index.
+ */
+ public NameQuery(Name nodeName,
+ IndexFormatVersion version,
+ NamespaceMappings nsMappings) {
+ this.nodeName = nodeName;
+ this.version = version;
+ this.nsMappings = nsMappings;
+ }
+
+ /**
+ * @return the name of the nodes to return.
+ */
+ public Name getName() {
+ return nodeName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Query rewrite(IndexReader reader) throws IOException {
+ if (version.getVersion() >= IndexFormatVersion.V3.getVersion()) {
+ // use LOCAL_NAME and NAMESPACE_URI field
+ BooleanQuery name = new BooleanQuery();
+ name.add(new TermQuery(new Term(FieldNames.NAMESPACE_URI, nodeName.getNamespaceURI())),
+ BooleanClause.Occur.MUST);
+ name.add(new TermQuery(new Term(FieldNames.LOCAL_NAME,
+ nodeName.getLocalName())),
+ BooleanClause.Occur.MUST);
+ return name;
+ } else {
+ // use LABEL field
+ try {
+ return new TermQuery(new Term(FieldNames.LABEL,
+ nsMappings.translatePropertyName(nodeName)));
+ } catch (IllegalNameException e) {
+ throw Util.createIOException(e);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void extractTerms(Set terms) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString(String field) {
+ return "name() = " + nodeName.toString();
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java?rev=647798&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java Mon Apr 14 06:54:14 2008
@@ -0,0 +1,193 @@
+/*
+ * 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.core.query.lucene;
+
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.ToStringUtils;
+import org.apache.jackrabbit.spi.Name;
+
+import javax.jcr.NamespaceException;
+import javax.jcr.RepositoryException;
+import java.io.IOException;
+
+/**
+ * <code>NameRangeQuery</code>...
+ */
+public class NameRangeQuery extends Query {
+
+ /**
+ * The lower name. May be <code>null</code> if <code>upperName</code> is not
+ * <code>null</code>.
+ */
+ private final Name lowerName;
+
+ /**
+ * The upper name. May be <code>null</code> if <code>lowerName</code> is not
+ * <code>null</code>.
+ */
+ private final Name upperName;
+
+ /**
+ * If <code>true</code> the range interval is inclusive.
+ */
+ private final boolean inclusive;
+
+ /**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * The internal namespace mappings.
+ */
+ private final NamespaceMappings nsMappings;
+
+ /**
+ * Creates a new NameRangeQuery. The lower or the upper name may be
+ * <code>null</code>, but not both!
+ *
+ * @param lowerName the lower name of the interval, or <code>null</code>
+ * @param upperName the upper name of the interval, or <code>null</code>.
+ * @param inclusive if <code>true</code> the interval is inclusive.
+ * @param version the index format version.
+ * @param nsMappings the internal namespace mappings.
+ */
+ public NameRangeQuery(Name lowerName,
+ Name upperName,
+ boolean inclusive,
+ IndexFormatVersion version,
+ NamespaceMappings nsMappings) {
+ if (lowerName == null && upperName == null) {
+ throw new IllegalArgumentException("At least one term must be non-null");
+ }
+ if (lowerName != null && upperName != null &&
+ !lowerName.getNamespaceURI().equals(upperName.getNamespaceURI())) {
+ throw new IllegalArgumentException("Both names must have the same namespace URI");
+ }
+ this.lowerName = lowerName;
+ this.upperName = upperName;
+ this.inclusive = inclusive;
+ this.version = version;
+ this.nsMappings = nsMappings;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Query rewrite(IndexReader reader) throws IOException {
+ if (version.getVersion() >= IndexFormatVersion.V3.getVersion()) {
+ RangeQuery localNames = new RangeQuery(getLowerLocalNameTerm(),
+ getUpperLocalNameTerm(), inclusive);
+ BooleanQuery query = new BooleanQuery();
+ query.add(new TermQuery(new Term(FieldNames.NAMESPACE_URI,
+ getNamespaceURI())), BooleanClause.Occur.MUST);
+ query.add(localNames, BooleanClause.Occur.MUST);
+ return query.rewrite(reader);
+ } else {
+ return new RangeQuery(getLowerTerm(), getUpperTerm(), inclusive).rewrite(reader);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString(String field) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("name():");
+ buffer.append(inclusive ? "[" : "{");
+ buffer.append(lowerName != null ? lowerName.toString() : "null");
+ buffer.append(" TO ");
+ buffer.append(upperName != null ? upperName.toString() : "null");
+ buffer.append(inclusive ? "]" : "}");
+ buffer.append(ToStringUtils.boost(getBoost()));
+ return buffer.toString();
+ }
+
+ //----------------------------< internal >----------------------------------
+
+ /**
+ * @return the namespace URI of this name query.
+ */
+ private String getNamespaceURI() {
+ return lowerName != null ? lowerName.getNamespaceURI() : upperName.getNamespaceURI();
+ }
+
+ /**
+ * @return the local name term of the lower name or <code>null</code> if no
+ * lower name is set.
+ */
+ private Term getLowerLocalNameTerm() {
+ if (lowerName == null) {
+ return null;
+ } else {
+ return new Term(FieldNames.LOCAL_NAME, lowerName.getLocalName());
+ }
+ }
+
+ /**
+ * @return the local name term of the upper name or <code>null</code> if no
+ * upper name is set.
+ */
+ private Term getUpperLocalNameTerm() {
+ if (upperName == null) {
+ return null;
+ } else {
+ return new Term(FieldNames.LOCAL_NAME, upperName.getLocalName());
+ }
+ }
+
+ /**
+ * @return the lower term. Must only be used for IndexFormatVersion < 3.
+ * @throws IOException if a name cannot be translated.
+ */
+ private Term getLowerTerm() throws IOException {
+ try {
+ String text;
+ if (lowerName == null) {
+ text = nsMappings.getPrefix(upperName.getNamespaceURI()) + ":";
+ } else {
+ text = nsMappings.translatePropertyName(lowerName);
+ }
+ return new Term(FieldNames.LABEL, text);
+ } catch (RepositoryException e) {
+ throw Util.createIOException(e);
+ }
+ }
+
+ /**
+ * @return the upper term. Must only be used for IndexFormatVersion < 3.
+ * @throws IOException if a name cannot be translated.
+ */
+ private Term getUpperTerm() throws IOException {
+ try {
+ String text;
+ if (upperName == null) {
+ text = nsMappings.getPrefix(lowerName.getNamespaceURI()) + ":\uFFFF";
+ } else {
+ text = nsMappings.translatePropertyName(upperName);
+ }
+ return new Term(FieldNames.LABEL, text);
+ } catch (RepositoryException e) {
+ throw Util.createIOException(e);
+ }
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NameRangeQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java Mon Apr 14 06:54:14 2008
@@ -182,7 +182,7 @@
if (node.getParentId() == null) {
// root node
doc.add(new Field(FieldNames.PARENT, "", Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO));
- doc.add(new Field(FieldNames.LABEL, "", Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
+ addNodeName(doc, "", "");
} else {
doc.add(new Field(
FieldNames.PARENT, node.getParentId().toString(),
@@ -196,8 +196,8 @@
"Missing child node entry for node with id: "
+ node.getNodeId());
}
- String name = resolver.getJCRName(child.getName());
- doc.add(new Field(FieldNames.LABEL, name, Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
+ Name name = child.getName();
+ addNodeName(doc, name.getNamespaceURI(), name.getLocalName());
}
} catch (NoSuchItemStateException e) {
throwRepositoryException(e);
@@ -798,5 +798,25 @@
doc.add(new Field(FieldNames.PROPERTY_LENGTHS,
FieldNames.createNamedLength(propertyName, length),
Field.Store.NO, Field.Index.NO_NORMS));
+ }
+
+ /**
+ * Depending on the index format version adds one or two fields to the
+ * document for the node name.
+ *
+ * @param doc the lucene document.
+ * @param namespaceURI the namespace URI of the node name.
+ * @param localName the local name of the node.
+ */
+ protected void addNodeName(Document doc,
+ String namespaceURI,
+ String localName) throws NamespaceException {
+ String name = mappings.getPrefix(namespaceURI) + ":" + localName;
+ doc.add(new Field(FieldNames.LABEL, name, Field.Store.NO, Field.Index.NO_NORMS));
+ // as of version 3, also index combination of namespace URI and local name
+ if (indexFormatVersion.getVersion() >= IndexFormatVersion.V3.getVersion()) {
+ doc.add(new Field(FieldNames.NAMESPACE_URI, namespaceURI, Field.Store.NO, Field.Index.NO_NORMS));
+ doc.add(new Field(FieldNames.LOCAL_NAME, localName, Field.Store.NO, Field.Index.NO_NORMS));
+ }
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java Mon Apr 14 06:54:14 2008
@@ -24,8 +24,9 @@
import org.apache.lucene.search.Similarity;
import org.apache.lucene.search.HitCollector;
import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermDocs;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.core.query.lucene.hits.ScorerHits;
+import org.apache.jackrabbit.core.query.lucene.hits.Hits;
import java.io.IOException;
import java.util.BitSet;
@@ -52,7 +53,17 @@
* The nameTest to apply on the parent axis, or <code>null</code> if any
* parent node should be selected.
*/
- private final String nameTest;
+ private final Name nameTest;
+
+ /**
+ * The index format version.
+ */
+ private final IndexFormatVersion version;
+
+ /**
+ * The internal namespace mappings.
+ */
+ private final NamespaceMappings nsMappings;
/**
* The scorer of the context query
@@ -66,10 +77,15 @@
* @param context the context for this query.
* @param nameTest a name test or <code>null</code> if any parent node is
* selected.
+ * @param version the index format version.
+ * @param nsMappings the internal namespace mappings.
*/
- ParentAxisQuery(Query context, String nameTest) {
+ ParentAxisQuery(Query context, Name nameTest,
+ IndexFormatVersion version, NamespaceMappings nsMappings) {
this.contextQuery = context;
this.nameTest = nameTest;
+ this.version = version;
+ this.nsMappings = nsMappings;
}
/**
@@ -97,7 +113,7 @@
if (cQuery == contextQuery) {
return this;
} else {
- return new ParentAxisQuery(cQuery, nameTest);
+ return new ParentAxisQuery(cQuery, nameTest, version, nsMappings);
}
}
@@ -172,7 +188,8 @@
public Scorer scorer(IndexReader reader) throws IOException {
contextScorer = contextQuery.weight(searcher).scorer(reader);
HierarchyResolver resolver = (HierarchyResolver) reader;
- return new ParentAxisScorer(searcher.getSimilarity(), reader, resolver);
+ return new ParentAxisScorer(searcher.getSimilarity(),
+ reader, searcher, resolver);
}
/**
@@ -201,6 +218,11 @@
private final HierarchyResolver hResolver;
/**
+ * The searcher instance.
+ */
+ private final Searcher searcher;
+
+ /**
* BitSet storing the id's of selected documents
*/
private BitSet hits;
@@ -225,10 +247,16 @@
*
* @param similarity the <code>Similarity</code> instance to use.
* @param reader for index access.
+ * @param searcher the index searcher.
+ * @param resolver the hierarchy resolver.
*/
- protected ParentAxisScorer(Similarity similarity, IndexReader reader, HierarchyResolver resolver) {
+ protected ParentAxisScorer(Similarity similarity,
+ IndexReader reader,
+ Searcher searcher,
+ HierarchyResolver resolver) {
super(similarity);
this.reader = reader;
+ this.searcher = searcher;
this.hResolver = resolver;
}
@@ -305,24 +333,21 @@
// filter out documents that do not match the name test
if (nameTest != null) {
- TermDocs tDocs = reader.termDocs(new Term(FieldNames.LABEL, nameTest));
- try {
- for (int i = hits.nextSetBit(0); i >= 0; i = hits.nextSetBit(i + 1)) {
- if (!tDocs.skipTo(i)) {
- // no more name tests, clear remaining
- hits.clear(i, hits.length());
- } else {
- // assert doc >= i
- int doc = tDocs.doc();
- if (doc > i) {
- // clear hits
- hits.clear(i, doc);
- i = doc;
- }
+ Query nameQuery = new NameQuery(nameTest, version, nsMappings);
+ Hits nameHits = new ScorerHits(nameQuery.weight(searcher).scorer(reader));
+ for (int i = hits.nextSetBit(0); i >= 0; i = hits.nextSetBit(i + 1)) {
+ int doc = nameHits.skipTo(i);
+ if (doc == -1) {
+ // no more name tests, clear remaining
+ hits.clear(i, hits.length());
+ } else {
+ // assert doc >= i
+ if (doc > i) {
+ // clear hits
+ hits.clear(i, doc);
+ i = doc;
}
}
- } finally {
- tDocs.close();
}
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PropertiesSynonymProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PropertiesSynonymProvider.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PropertiesSynonymProvider.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PropertiesSynonymProvider.java Mon Apr 14 06:54:14 2008
@@ -89,9 +89,7 @@
configLastModified = config.lastModified();
lastCheck = System.currentTimeMillis();
} catch (FileSystemException e) {
- IOException ex = new IOException();
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
}
@@ -161,9 +159,7 @@
}
return synonyms;
} catch (FileSystemException e) {
- IOException ex = new IOException();
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java Mon Apr 14 06:54:14 2008
@@ -490,6 +490,11 @@
log.info("Index initialized: {} Version: {}",
new Object[]{path, index.getIndexFormatVersion()});
+ if (!index.getIndexFormatVersion().equals(getIndexFormatVersion())) {
+ log.warn("Using Version {} for reading. Please re-index version " +
+ "storage for optimal performance.",
+ new Integer(getIndexFormatVersion().getVersion()));
+ }
}
/**
@@ -719,9 +724,7 @@
try {
ep = (ExcerptProvider) excerptProviderClass.newInstance();
} catch (Exception e) {
- IOException ex = new IOException();
- ex.initCause(e);
- throw ex;
+ throw Util.createIOException(e);
}
ep.init(query, this);
return ep;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SimilarityQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SimilarityQuery.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SimilarityQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SimilarityQuery.java Mon Apr 14 06:54:14 2008
@@ -17,7 +17,7 @@
package org.apache.jackrabbit.core.query.lucene;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
@@ -67,7 +67,7 @@
return similarityQuery.rewrite(reader);
} else {
// return dummy query that never matches
- return new TermQuery(new Term(FieldNames.UUID, "x"));
+ return new BooleanQuery();
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java Mon Apr 14 06:54:14 2008
@@ -96,4 +96,15 @@
return new MatchAllQuery(name);
}
}
+
+ /**
+ * Creates an {@link IOException} with <code>t</code> as its cause.
+ *
+ * @param t the cause.
+ */
+ public static IOException createIOException(Throwable t) {
+ IOException ex = new IOException(t.getMessage());
+ ex.initCause(t);
+ return ex;
+ }
}
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java?rev=647798&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java Mon Apr 14 06:54:14 2008
@@ -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.core.query.qom;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.query.Query;
+import java.util.Calendar;
+
+/**
+ * <code>NodeLocalNameTest</code> checks if conversion of literals is correctly
+ * performed and operators work as specified.
+ * TODO: assumes https://jsr-283.dev.java.net/issues/show_bug.cgi?id=483 gets resolved as initially proposed
+ */
+public class NodeLocalNameTest extends AbstractQOMTest {
+
+ private Node node1;
+
+ private String nodeLocalName;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ node1 = testRootNode.addNode(nodeName1, testNodeType);
+ testRootNode.save();
+ int colon = nodeName1.indexOf(':');
+ if (colon != -1) {
+ nodeLocalName = nodeName1.substring(colon + 1);
+ } else {
+ nodeLocalName = nodeName1;
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ node1 = null;
+ super.tearDown();
+ }
+
+ public void testStringLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(nodeLocalName);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{node1});
+ }
+
+ public void testStringLiteralInvalidName() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue("[" + nodeLocalName);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testBinaryLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(
+ nodeLocalName, PropertyType.BINARY);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{node1});
+ }
+
+ public void testDateLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(Calendar.getInstance());
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testDoubleLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(Math.PI);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testDecimalLiteral() throws RepositoryException {
+ // TODO must not match node
+ }
+
+ public void testLongLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(283);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testBooleanLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(true);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testNameLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(
+ nodeLocalName, PropertyType.NAME);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{node1});
+ }
+
+ public void testPathLiteral() throws RepositoryException {
+ Value literal = superuser.getValueFactory().createValue(
+ nodeLocalName, PropertyType.PATH);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{node1});
+
+ literal = superuser.getValueFactory().createValue(
+ node1.getPath(), PropertyType.PATH);
+ q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+
+ literal = superuser.getValueFactory().createValue(
+ nodeName1 + "/" + nodeName1, PropertyType.PATH);
+ q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testReferenceLiteral() throws RepositoryException {
+ if (!node1.isNodeType(mixReferenceable)) {
+ node1.addMixin(mixReferenceable);
+ }
+ node1.save();
+ Value literal = superuser.getValueFactory().createValue(node1);
+ Query q = createQuery(OPERATOR_EQUAL_TO, literal);
+ checkResult(q.execute(), new Node[]{});
+ }
+
+ public void testWeakReferenceLiteral() throws RepositoryException {
+ // TODO must not match node
+ }
+
+ public void testURILiteral() throws RepositoryException {
+ // TODO must not match node
+ }
+
+ public void testEqualTo() throws RepositoryException {
+ checkOperator(OPERATOR_EQUAL_TO, false, true, false);
+ }
+
+ public void testGreaterThan() throws RepositoryException {
+ checkOperator(OPERATOR_GREATER_THAN, true, false, false);
+ }
+
+ public void testGreaterThanOrEqualTo() throws RepositoryException {
+ checkOperator(OPERATOR_GREATER_THAN_OR_EQUAL_TO, true, true, false);
+ }
+
+ public void testLessThan() throws RepositoryException {
+ checkOperator(OPERATOR_LESS_THAN, false, false, true);
+ }
+
+ public void testLessThanOrEqualTo() throws RepositoryException {
+ checkOperator(OPERATOR_LESS_THAN_OR_EQUAL_TO, false, true, true);
+ }
+
+ public void testLike() throws RepositoryException {
+ checkOperator(OPERATOR_LIKE, false, true, false);
+ }
+
+ public void testNotEqualTo() throws RepositoryException {
+ checkOperator(OPERATOR_NOT_EQUAL_TO, true, false, true);
+ }
+
+ //------------------------------< helper >----------------------------------
+
+ private void checkOperator(int operator,
+ boolean matchesLesser,
+ boolean matchesEqual,
+ boolean matchesGreater)
+ throws RepositoryException {
+ checkOperatorSingleLiteral(createLexicographicallyLesser(nodeLocalName), operator, matchesLesser);
+ checkOperatorSingleLiteral(nodeLocalName, operator, matchesEqual);
+ checkOperatorSingleLiteral(createLexicographicallyGreater(nodeLocalName), operator, matchesGreater);
+ }
+
+ private void checkOperatorSingleLiteral(String literal,
+ int operator,
+ boolean matches)
+ throws RepositoryException {
+ Value value = superuser.getValueFactory().createValue(literal);
+ Query q = createQuery(operator, value);
+ checkResult(q.execute(), matches ? new Node[]{node1} : new Node[0]);
+ }
+
+ private String createLexicographicallyGreater(String name) {
+ StringBuffer tmp = new StringBuffer(name);
+ tmp.setCharAt(tmp.length() - 1, (char) (tmp.charAt(tmp.length() - 1) + 1));
+ return tmp.toString();
+ }
+
+ private String createLexicographicallyLesser(String name) {
+ StringBuffer tmp = new StringBuffer(name);
+ tmp.setCharAt(tmp.length() - 1, (char) (tmp.charAt(tmp.length() - 1) - 1));
+ return tmp.toString();
+ }
+
+ private Query createQuery(int operator, Value literal) throws RepositoryException {
+ return qomFactory.createQuery(
+ qomFactory.selector(testNodeType, "s"),
+ qomFactory.and(
+ qomFactory.childNode("s", testRoot),
+ qomFactory.comparison(
+ qomFactory.nodeLocalName("s"),
+ operator,
+ qomFactory.literal(literal)
+ )
+ ), null, null);
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeNameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeNameTest.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeNameTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/NodeNameTest.java Mon Apr 14 06:54:14 2008
@@ -177,26 +177,6 @@
checkOperator(OPERATOR_EQUAL_TO, false, true, false);
}
- public void testGreaterThan() throws RepositoryException {
- checkOperator(OPERATOR_GREATER_THAN, true, false, false);
- }
-
- public void testGreaterThanOrEqualTo() throws RepositoryException {
- checkOperator(OPERATOR_GREATER_THAN_OR_EQUAL_TO, true, true, false);
- }
-
- public void testLessThan() throws RepositoryException {
- checkOperator(OPERATOR_LESS_THAN, false, false, true);
- }
-
- public void testLessThanOrEqualTo() throws RepositoryException {
- checkOperator(OPERATOR_LESS_THAN_OR_EQUAL_TO, false, true, true);
- }
-
- public void testLike() throws RepositoryException {
- checkOperator(OPERATOR_LIKE, false, true, false);
- }
-
public void testNotEqualTo() throws RepositoryException {
checkOperator(OPERATOR_NOT_EQUAL_TO, true, false, true);
}
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/TestAll.java?rev=647798&r1=647797&r2=647798&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/TestAll.java Mon Apr 14 06:54:14 2008
@@ -33,6 +33,7 @@
suite.addTestSuite(ChildNodeTest.class);
suite.addTestSuite(DescendantNodeTest.class);
suite.addTestSuite(LengthTest.class);
+ suite.addTestSuite(NodeLocalNameTest.class);
suite.addTestSuite(NodeNameTest.class);
suite.addTestSuite(PropertyExistenceTest.class);
suite.addTestSuite(QueryObjectModelFactoryTest.class);