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 2007/09/07 18:10:02 UTC

svn commit: r573622 [1/2] - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/query/ main/java/org/apache/jackrabbit/core/query/jsr283/qom/ main/java/org/apache/jackrabbit/core/query/lucene/ main/java/org/apache/jackrabbit/...

Author: mreutegg
Date: Fri Sep  7 09:09:59 2007
New Revision: 573622

URL: http://svn.apache.org/viewvc?rev=573622&view=rev
Log:
JCR-1104: JSR 283 support
- JQOM work in progress

Added:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/SelectorQueryTest.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/QueryObjectModelFactory.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultTraversingQOMTreeVisitor.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/QOMTreeVisitor.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelFactoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelTree.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeJoinConditionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/SelectorImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/UpperCaseImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java Fri Sep  7 09:09:59 2007
@@ -36,7 +36,7 @@
     /**
      * The executable prepared query.
      */
-    protected ExecutablePreparedQuery query;
+    protected ExecutablePreparedQuery prepQuery;
 
     /**
      * The query object model tree.
@@ -56,8 +56,8 @@
         this.language = language;
         this.handler = handler;
         this.statement = statement;
-        this.query = handler.createExecutablePreparedQuery(
-                session, itemMgr, createQOMTree(statement, language));
+        setExecutableQuery(handler.createExecutablePreparedQuery(
+                session, itemMgr, createQOMTree(statement, language)));
         setInitialized();
     }
 
@@ -76,10 +76,10 @@
         if (!node.isNodeType(session.getJCRName(QName.NT_QUERY))) {
             throw new InvalidQueryException("node is not of type nt:query");
         }
-        statement = node.getProperty(session.getJCRName(QName.JCR_STATEMENT)).getString();
-        language = node.getProperty(session.getJCRName(QName.JCR_LANGUAGE)).getString();
-        query = handler.createExecutablePreparedQuery(
-                session, itemMgr, createQOMTree(statement, language));
+        this.statement = node.getProperty(session.getJCRName(QName.JCR_STATEMENT)).getString();
+        this.language = node.getProperty(session.getJCRName(QName.JCR_LANGUAGE)).getString();
+        setExecutableQuery(handler.createExecutablePreparedQuery(
+                session, itemMgr, createQOMTree(statement, language)));
         setInitialized();
     }
 
@@ -98,7 +98,8 @@
         this.handler = handler;
         this.qomTree = qomTree;
         this.statement = null; // TODO: format qomTree into a SQL2 statement
-        this.query = handler.createExecutablePreparedQuery(session, itemMgr, qomTree);
+        setExecutableQuery(handler.createExecutablePreparedQuery(
+                session, itemMgr, qomTree));
         setInitialized();
     }
 
@@ -116,13 +117,23 @@
     public void bindValue(String varName, Value value)
             throws IllegalArgumentException, RepositoryException {
         try {
-            query.bindValue(session.getQName(varName), value);
+            prepQuery.bindValue(session.getQName(varName), value);
         } catch (NameException e) {
             throw new RepositoryException(e.getMessage());
         }
     }
 
     //----------------------------< internal >----------------------------------
+
+    /**
+     * Sets the executable query.
+     *
+     * @param query the executable query.
+     */
+    private void setExecutableQuery(ExecutablePreparedQuery query) {
+        super.query = query;
+        this.prepQuery = query;
+    }
 
     /**
      * Creates a {@link QueryObjectModelTree} representation for the query

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java?rev=573622&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java Fri Sep  7 09:09:59 2007
@@ -0,0 +1,24 @@
+/*
+ * 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.jsr283.qom;
+
+/**
+ * Evaluates to a <code>Literal</code> value.
+ */
+public interface Literal extends StaticOperand {
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/Literal.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/QueryObjectModelFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/QueryObjectModelFactory.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/QueryObjectModelFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/jsr283/qom/QueryObjectModelFactory.java Fri Sep  7 09:09:59 2007
@@ -18,6 +18,7 @@
 
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.RepositoryException;
+import javax.jcr.Value;
 
 /**
  * A <code>QueryObjectModelFactory</code> creates instances of the JCR query
@@ -561,6 +562,17 @@
      * @throws RepositoryException   if the operation otherwise fails
      */
     public BindVariableValue bindVariable(String bindVariableName)
+            throws InvalidQueryException, RepositoryException;
+
+    /**
+     * Evaluates to a literal value.
+     *
+     * @param value a JCR value; non-null
+     * @return the operand; non-null
+     * @throws InvalidQueryException if the query is invalid
+     * @throws RepositoryException   if the operation otherwise fails
+     */
+    public Literal literal(Value value)
             throws InvalidQueryException, RepositoryException;
 
     ///

Added: 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=573622&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java Fri Sep  7 09:09:59 2007
@@ -0,0 +1,649 @@
+/*
+ * 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.jackrabbit.core.query.qom.QOMTreeVisitor;
+import org.apache.jackrabbit.core.query.qom.AndImpl;
+import org.apache.jackrabbit.core.query.qom.BindVariableValueImpl;
+import org.apache.jackrabbit.core.query.qom.ChildNodeImpl;
+import org.apache.jackrabbit.core.query.qom.ChildNodeJoinConditionImpl;
+import org.apache.jackrabbit.core.query.qom.ColumnImpl;
+import org.apache.jackrabbit.core.query.qom.ComparisonImpl;
+import org.apache.jackrabbit.core.query.qom.DescendantNodeImpl;
+import org.apache.jackrabbit.core.query.qom.DescendantNodeJoinConditionImpl;
+import org.apache.jackrabbit.core.query.qom.EquiJoinConditionImpl;
+import org.apache.jackrabbit.core.query.qom.FullTextSearchImpl;
+import org.apache.jackrabbit.core.query.qom.FullTextSearchScoreImpl;
+import org.apache.jackrabbit.core.query.qom.JoinImpl;
+import org.apache.jackrabbit.core.query.qom.LengthImpl;
+import org.apache.jackrabbit.core.query.qom.LowerCaseImpl;
+import org.apache.jackrabbit.core.query.qom.NodeLocalNameImpl;
+import org.apache.jackrabbit.core.query.qom.NodeNameImpl;
+import org.apache.jackrabbit.core.query.qom.NotImpl;
+import org.apache.jackrabbit.core.query.qom.OrderingImpl;
+import org.apache.jackrabbit.core.query.qom.OrImpl;
+import org.apache.jackrabbit.core.query.qom.PropertyExistenceImpl;
+import org.apache.jackrabbit.core.query.qom.PropertyValueImpl;
+import org.apache.jackrabbit.core.query.qom.QueryObjectModelTree;
+import org.apache.jackrabbit.core.query.qom.SameNodeImpl;
+import org.apache.jackrabbit.core.query.qom.SameNodeJoinConditionImpl;
+import org.apache.jackrabbit.core.query.qom.SelectorImpl;
+import org.apache.jackrabbit.core.query.qom.UpperCaseImpl;
+import org.apache.jackrabbit.core.query.qom.ConstraintImpl;
+import org.apache.jackrabbit.core.query.qom.LiteralImpl;
+import org.apache.jackrabbit.core.query.qom.StaticOperandImpl;
+import org.apache.jackrabbit.core.query.qom.DynamicOperandImpl;
+import org.apache.jackrabbit.core.query.qom.DefaultTraversingQOMTreeVisitor;
+import org.apache.jackrabbit.core.query.PropertyTypeRegistry;
+import org.apache.jackrabbit.core.query.jsr283.qom.QueryObjectModelConstants;
+import org.apache.jackrabbit.core.query.lucene.fulltext.QueryParser;
+import org.apache.jackrabbit.core.SessionImpl;
+import org.apache.jackrabbit.core.HierarchyManager;
+import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.NodeImpl;
+import org.apache.jackrabbit.core.HierarchyManagerImpl;
+import org.apache.jackrabbit.core.state.ItemStateManager;
+import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.name.PathFormat;
+import org.apache.lucene.analysis.Analyzer;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.PropertyType;
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeIterator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Implements a query builder that takes an JQOM and creates a lucene {@link
+ * org.apache.lucene.search.Query} tree that can be executed on an index.
+ */
+public class JQOM2LuceneQueryBuilder implements QOMTreeVisitor {
+
+    /**
+     * Logger for this class
+     */
+    private static final Logger log = LoggerFactory.getLogger(JQOM2LuceneQueryBuilder.class);
+
+    /**
+     * The root of the query object model tree.
+     */
+    private final QueryObjectModelTree qomTree;
+
+    /**
+     * Session of the user executing this query
+     */
+    private final SessionImpl session;
+
+    /**
+     * The shared item state manager of the workspace.
+     */
+    private final ItemStateManager sharedItemMgr;
+
+    /**
+     * A hierarchy manager based on {@link #sharedItemMgr} to resolve paths.
+     */
+    private final HierarchyManager hmgr;
+
+    /**
+     * Namespace mappings to internal prefixes
+     */
+    private final NamespaceMappings nsMappings;
+
+    /**
+     * The analyzer instance to use for contains function query parsing
+     */
+    private final Analyzer analyzer;
+
+    /**
+     * The property type registry.
+     */
+    private final PropertyTypeRegistry propRegistry;
+
+    /**
+     * The synonym provider or <code>null</code> if none is configured.
+     */
+    private final SynonymProvider synonymProvider;
+    
+    /**
+     * Maps variable names to values.
+     */ 
+    private final Map bindVariableValues;
+
+    /**
+     * The selector queries that have already been translated into lucene
+     * queries. Key=QName (selectorName).
+     */
+    private final Map selectors = new HashMap();
+
+    /**
+     * Creates a new <code>LuceneQueryBuilder</code> instance.
+     *
+     * @param qomTree            the root of the query object model.
+     * @param session            of the user executing this query.
+     * @param sharedItemMgr      the shared item state manager of the
+     *                           workspace.
+     * @param hmgr               a hierarchy manager based on sharedItemMgr.
+     * @param nsMappings         namespace resolver for internal prefixes.
+     * @param analyzer           for parsing the query statement of the contains
+     *                           function.
+     * @param propReg            the property type registry.
+     * @param synonymProvider    the synonym provider or <code>null</code> if
+     *                           node is configured.
+     * @param bindVariableValues the bind variable values.
+     */
+    private JQOM2LuceneQueryBuilder(QueryObjectModelTree qomTree,
+                                    SessionImpl session,
+                                    ItemStateManager sharedItemMgr,
+                                    HierarchyManager hmgr,
+                                    NamespaceMappings nsMappings,
+                                    Analyzer analyzer,
+                                    PropertyTypeRegistry propReg,
+                                    SynonymProvider synonymProvider,
+                                    Map bindVariableValues) {
+        this.qomTree = qomTree;
+        this.session = session;
+        this.sharedItemMgr = sharedItemMgr;
+        this.hmgr = hmgr;
+        this.nsMappings = nsMappings;
+        this.analyzer = analyzer;
+        this.propRegistry = propReg;
+        this.synonymProvider = synonymProvider;
+        this.bindVariableValues = bindVariableValues;
+    }
+
+    /**
+     * Creates a lucene {@link org.apache.lucene.search.Query} tree from an
+     * abstract query tree.
+     *
+     * @param qomTree            the root of the query object model.
+     * @param session            of the user executing the query.
+     * @param sharedItemMgr      the shared item state manager of the
+     *                           workspace.
+     * @param nsMappings         namespace resolver for internal prefixes.
+     * @param analyzer           for parsing the query statement of the contains
+     *                           function.
+     * @param propReg            the property type registry to lookup type
+     *                           information.
+     * @param synonymProvider    the synonym provider or <code>null</code> if
+     *                           node is configured.
+     * @param bindVariableValues the bind variable values.
+     * @return the lucene query tree.
+     * @throws RepositoryException if an error occurs during the translation.
+     */
+    public static Query createQuery(QueryObjectModelTree qomTree,
+                                    SessionImpl session,
+                                    ItemStateManager sharedItemMgr,
+                                    NamespaceMappings nsMappings,
+                                    Analyzer analyzer,
+                                    PropertyTypeRegistry propReg,
+                                    SynonymProvider synonymProvider,
+                                    Map bindVariableValues)
+            throws RepositoryException {
+
+        NodeId id = ((NodeImpl) session.getRootNode()).getNodeId();
+        HierarchyManager hmgr = new HierarchyManagerImpl(
+                id, sharedItemMgr, session);
+        JQOM2LuceneQueryBuilder builder = new JQOM2LuceneQueryBuilder(
+                qomTree, session, sharedItemMgr, hmgr, nsMappings,
+                analyzer, propReg, synonymProvider, bindVariableValues);
+
+        return builder.createLuceneQuery();
+    }
+
+    private Query createLuceneQuery() throws InvalidQueryException {
+        try {
+            return (Query) qomTree.accept(this, null);
+        } catch (InvalidQueryException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new InvalidQueryException(e.getMessage(), e);
+        }
+    }
+
+    //----------------------------< QOMTreeVisitor >----------------------------
+
+    public Object visit(AndImpl node, Object data) throws Exception {
+        BooleanQuery b = new BooleanQuery();
+        b.add((Query) ((ConstraintImpl) node.getConstraint1()).accept(this, data),
+                BooleanClause.Occur.MUST);
+        b.add((Query) ((ConstraintImpl) node.getConstraint2()).accept(this, data),
+                BooleanClause.Occur.MUST);
+        return b;
+    }
+
+    /**
+     * @return the {@link Value} for the passed bind variable value node.
+     * @throws InvalidQueryException if there is no value bound for the passed
+     *                               bind variable.
+     */
+    public Object visit(BindVariableValueImpl node, Object data)
+            throws InvalidQueryException {
+        Value v = (Value) bindVariableValues.get(node.getBindVariableQName());
+        if (v == null) {
+            throw new InvalidQueryException("No value bound for variable " +
+                    node.getBindVariableName());
+        } else {
+            return v;
+        }
+    }
+
+    public Object visit(ChildNodeImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(ChildNodeJoinConditionImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(ColumnImpl node, Object data) {
+        // query builder should not use this method
+        throw new IllegalStateException();
+    }
+
+    public Object visit(ComparisonImpl node, Object data) throws Exception {
+        Value v = (Value) ((StaticOperandImpl) node.getOperand2()).accept(this, data);
+        final String stringValue;
+        switch (v.getType()) {
+            case PropertyType.BINARY:
+                throw new InvalidQueryException("Binary value not supported in comparison");
+            case PropertyType.BOOLEAN:
+                stringValue = v.getString();
+                break;
+            case PropertyType.DATE:
+                stringValue = DateField.dateToString(v.getDate().getTime());
+                break;
+            case PropertyType.DOUBLE:
+                stringValue = DoubleField.doubleToString(v.getDouble());
+                break;
+            case PropertyType.LONG:
+                stringValue = LongField.longToString(v.getLong());
+                break;
+            case PropertyType.NAME:
+                stringValue = nsMappings.translatePropertyName(
+                        v.getString(), session.getNamespaceResolver());
+                break;
+            case PropertyType.PATH:
+                Path p = PathFormat.parse(v.getString(), session.getNamespaceResolver());
+                stringValue = PathFormat.format(p, nsMappings);
+                break;
+            case PropertyType.REFERENCE:
+                stringValue = v.getString();
+                break;
+            case PropertyType.STRING:
+                stringValue = v.getString();
+                break;
+            default:
+                // TODO: support for new types defined in JSR 283
+                throw new InvalidQueryException("Unsupported property type " +
+                        PropertyType.nameFromValue(v.getType()));
+        }
+
+        final int operator = node.getOperator();
+
+        return ((DynamicOperandImpl) node.getOperand1()).accept(
+                new DefaultTraversingQOMTreeVisitor() {
+            public Object visit(PropertyValueImpl node, Object data) throws Exception {
+                String propName = NameFormat.format(node.getPropertyQName(), nsMappings);
+                String text = FieldNames.createNamedValue(propName, stringValue);
+                switch (operator) {
+                    case QueryObjectModelConstants.OPERATOR_EQUAL_TO:
+                        return new TermQuery(new Term(FieldNames.PROPERTIES, text));
+                    case QueryObjectModelConstants.OPERATOR_GREATER_THAN:
+                        Term lower = new Term(FieldNames.PROPERTIES, text);
+                        Term upper = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(propName, "\uFFFF"));
+                        return new RangeQuery(lower, upper, false);
+                    case QueryObjectModelConstants.OPERATOR_GREATER_THAN_OR_EQUAL_TO:
+                        lower = new Term(FieldNames.PROPERTIES, text);
+                        upper = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(propName, "\uFFFF"));
+                        return new RangeQuery(lower, upper, true);
+                    case QueryObjectModelConstants.OPERATOR_LESS_THAN:
+                        lower = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(propName, ""));
+                        upper = new Term(FieldNames.PROPERTIES, text);
+                        return new RangeQuery(lower, upper, false);
+                    case QueryObjectModelConstants.OPERATOR_LESS_THAN_OR_EQUAL_TO:
+                        lower = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(propName, ""));
+                        upper = new Term(FieldNames.PROPERTIES, text);
+                        return new RangeQuery(lower, upper, true);
+                    case QueryObjectModelConstants.OPERATOR_LIKE:
+                        if (stringValue.equals("%")) {
+                            return new MatchAllQuery(propName);
+                        } else {
+                            return new WildcardQuery(FieldNames.PROPERTIES,
+                                    propName, stringValue);
+                        }
+                    case QueryObjectModelConstants.OPERATOR_NOT_EQUAL_TO:
+                        MatchAllQuery all = new MatchAllQuery(propName);
+                        BooleanQuery b = new BooleanQuery();
+                        b.add(all, BooleanClause.Occur.SHOULD);
+                        b.add(new TermQuery(new Term(FieldNames.PROPERTIES, text)),
+                                BooleanClause.Occur.MUST_NOT);
+                        return b;
+                    default:
+                        throw new InvalidQueryException("Unknown operator " +
+                                operator);
+                }
+            }
+
+            public Object visit(LengthImpl node, Object data) throws Exception {
+                // TODO: implement
+                return super.visit(node, data);
+            }
+
+            public Object visit(NodeLocalNameImpl node, Object data) throws Exception {
+                // TODO: implement
+                throw new UnsupportedOperationException("Not yet implemented");
+            }
+
+            public Object visit(NodeNameImpl node, Object data) throws Exception {
+                // TODO: implement
+                throw new UnsupportedOperationException("Not yet implemented");
+            }
+
+            public Object visit(FullTextSearchScoreImpl node, Object data)
+                    throws Exception {
+                // TODO: implement
+                throw new UnsupportedOperationException("Not yet implemented");
+            }
+
+            public Object visit(UpperCaseImpl node, Object data) throws Exception {
+                Object obj = super.visit(node, data);
+                if (obj instanceof Transformable) {
+                    ((Transformable) obj).setTransformation(TransformConstants.TRANSFORM_UPPER_CASE);
+                    return obj;
+                } else if (obj instanceof TermQuery) {
+                    return transformTermQuery((TermQuery) obj, true);
+                } else {
+                    throw new InvalidQueryException("upper-case not supported " +
+                            "on operand " + node.getOperand().getClass().getName());
+                }
+            }
+
+            public Object visit(LowerCaseImpl node, Object data) throws Exception {
+                Object obj = super.visit(node, data);
+                if (obj instanceof Transformable) {
+                    ((Transformable) obj).setTransformation(TransformConstants.TRANSFORM_LOWER_CASE);
+                    return obj;
+                } else if (obj instanceof TermQuery) {
+                    return transformTermQuery((TermQuery) obj, false);
+                } else {
+                    throw new InvalidQueryException("lower-case not supported " +
+                            "on operand " + node.getOperand().getClass().getName());
+                }
+            }
+
+            private Query transformTermQuery(TermQuery query, boolean toUpper)
+                    throws InvalidQueryException {
+                if (query.getTerm().field() == FieldNames.PROPERTIES) {
+                    if (toUpper) {
+                        return new CaseTermQuery.Upper(query.getTerm());
+                    } else {
+                        return new CaseTermQuery.Lower(query.getTerm());
+                    }
+                } else {
+                    throw new InvalidQueryException("Upper/LowerCase not " +
+                            "supported on field " + query.getTerm().field());
+                }
+            }
+        }, data);
+    }
+
+    public Object visit(DescendantNodeImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(DescendantNodeJoinConditionImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(EquiJoinConditionImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(FullTextSearchImpl node, Object data) throws Exception {
+        String fieldname;
+        if (node.getPropertyName() == null) {
+            // fulltext on node
+            fieldname = FieldNames.FULLTEXT;
+        } else {
+            // final path element is a property name
+            QName propName = node.getPropertyQName();
+            StringBuffer tmp = new StringBuffer();
+            tmp.append(nsMappings.getPrefix(propName.getNamespaceURI()));
+            tmp.append(":").append(FieldNames.FULLTEXT_PREFIX);
+            tmp.append(propName.getLocalName());
+            fieldname = tmp.toString();
+        }
+        QueryParser parser = new QueryParser(
+                fieldname, analyzer, synonymProvider);
+        parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);
+        // replace escaped ' with just '
+        StringBuffer query = new StringBuffer();
+        String textsearch = node.getFullTextSearchExpression();
+        // the default lucene query parser recognizes 'AND' and 'NOT' as
+        // keywords.
+        textsearch = textsearch.replaceAll("AND", "and");
+        textsearch = textsearch.replaceAll("NOT", "not");
+        boolean escaped = false;
+        for (int i = 0; i < textsearch.length(); i++) {
+            if (textsearch.charAt(i) == '\\') {
+                if (escaped) {
+                    query.append("\\\\");
+                    escaped = false;
+                } else {
+                    escaped = true;
+                }
+            } else if (textsearch.charAt(i) == '\'') {
+                if (escaped) {
+                    escaped = false;
+                }
+                query.append(textsearch.charAt(i));
+            } else {
+                if (escaped) {
+                    query.append('\\');
+                    escaped = false;
+                }
+                query.append(textsearch.charAt(i));
+            }
+        }
+        return parser.parse(query.toString());
+    }
+
+    public Object visit(FullTextSearchScoreImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(JoinImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(LengthImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    /**
+     * @return the {@link Value} of the literal <code>node</code>.
+     */
+    public Object visit(LiteralImpl node, Object data) {
+        return node.getValue();
+    }
+
+    public Object visit(LowerCaseImpl node, Object data) {
+        // query builder should not use this method
+        throw new IllegalStateException();
+    }
+
+    public Object visit(NodeLocalNameImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(NodeNameImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(NotImpl node, Object data) throws Exception {
+        Query c = (Query) ((ConstraintImpl) node.getConstraint()).accept(this, data);
+        return new NotQuery(c);
+    }
+
+    public Object visit(OrderingImpl node, Object data) {
+        // query builder should not use this method
+        throw new IllegalStateException();
+    }
+
+    public Object visit(OrImpl node, Object data) throws Exception {
+        BooleanQuery b = new BooleanQuery();
+        b.add((Query) ((ConstraintImpl) node.getConstraint1()).accept(this, data),
+                BooleanClause.Occur.SHOULD);
+        b.add((Query) ((ConstraintImpl) node.getConstraint2()).accept(this, data),
+                BooleanClause.Occur.SHOULD);
+        return b;
+    }
+
+    public Object visit(PropertyExistenceImpl node, Object data) throws Exception {
+        String propName = NameFormat.format(node.getPropertyQName(), nsMappings);
+        return new MatchAllQuery(propName);
+    }
+
+    public Object visit(PropertyValueImpl node, Object data) {
+        // query builder should not use this method
+        throw new IllegalStateException();
+    }
+
+    public Object visit(QueryObjectModelTree node, Object data)
+            throws Exception {
+        Query source = (Query) node.getSource().accept(this, data);
+        if (node.getConstraint() == null) {
+            return source;
+        } else {
+            Query constraint = (Query) node.getConstraint().accept(this, data);
+            BooleanQuery b = new BooleanQuery();
+            b.add(source, BooleanClause.Occur.MUST);
+            b.add(constraint, BooleanClause.Occur.MUST);
+            return b;
+        }
+    }
+
+    public Object visit(SameNodeImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(SameNodeJoinConditionImpl node, Object data) {
+        // TODO: implement
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    public Object visit(SelectorImpl node, Object data) throws Exception {
+        List terms = new ArrayList();
+        String mixinTypesField = NameFormat.format(QName.JCR_MIXINTYPES, nsMappings);
+        String primaryTypeField = NameFormat.format(QName.JCR_PRIMARYTYPE, nsMappings);
+
+        NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
+        NodeType base = null;
+        try {
+            base = ntMgr.getNodeType(session.getJCRName(node.getNodeTypeQName()));
+        } catch (RepositoryException e) {
+            // node type does not exist
+        }
+
+        if (base != null && base.isMixin()) {
+            // search for nodes where jcr:mixinTypes is set to this mixin
+            Term t = new Term(FieldNames.PROPERTIES,
+                    FieldNames.createNamedValue(mixinTypesField,
+                            NameFormat.format(node.getNodeTypeQName(), nsMappings)));
+            terms.add(t);
+        } else {
+            // search for nodes where jcr:primaryType is set to this type
+            Term t = new Term(FieldNames.PROPERTIES,
+                    FieldNames.createNamedValue(primaryTypeField,
+                            NameFormat.format(node.getNodeTypeQName(), nsMappings)));
+            terms.add(t);
+        }
+
+        // now search for all node types that are derived from base
+        if (base != null) {
+            NodeTypeIterator allTypes = ntMgr.getAllNodeTypes();
+            while (allTypes.hasNext()) {
+                NodeType nt = allTypes.nextNodeType();
+                NodeType[] superTypes = nt.getSupertypes();
+                if (Arrays.asList(superTypes).contains(base)) {
+                    String ntName = nsMappings.translatePropertyName(nt.getName(),
+                            session.getNamespaceResolver());
+                    Term t;
+                    if (nt.isMixin()) {
+                        // search on jcr:mixinTypes
+                        t = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(mixinTypesField, ntName));
+                    } else {
+                        // search on jcr:primaryType
+                        t = new Term(FieldNames.PROPERTIES,
+                                FieldNames.createNamedValue(primaryTypeField, ntName));
+                    }
+                    terms.add(t);
+                }
+            }
+        }
+        Query q;
+        if (terms.size() == 1) {
+            q= new TermQuery((Term) terms.get(0));
+        } else {
+            BooleanQuery b = new BooleanQuery();
+            for (Iterator it = terms.iterator(); it.hasNext();) {
+                b.add(new TermQuery((Term) it.next()), BooleanClause.Occur.SHOULD);
+            }
+            q = b;
+        }
+        selectors.put(node.getSelectorQName(), q);
+        return q;
+    }
+
+    public Object visit(UpperCaseImpl node, Object data) throws Exception {
+        // query builder should not use this method
+        throw new IllegalStateException();
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java Fri Sep  7 09:09:59 2007
@@ -102,8 +102,10 @@
      */
     public QueryResult execute(long offset, long limit)
             throws RepositoryException {
-        // TODO: turn QOM tree into a lucene query
-        Query query = null;
+        Query query = JQOM2LuceneQueryBuilder.createQuery(qomTree, session,
+                index.getContext().getItemStateManager(),
+                index.getNamespaceMappings(), index.getTextAnalyzer(),
+                propReg, index.getSynonymProvider(), bindValues);
 
         ColumnImpl[] columns = qomTree.getColumns();
         QName[] selectProps = new QName[columns.length];
@@ -155,10 +157,15 @@
      */
     private void extractBindVariableNames(QueryObjectModelTree qomTree,
                                            final Set bindVariableNames) {
-        qomTree.accept(new DefaultTraversingQOMTreeVisitor() {
-            public void visit(BindVariableValueImpl node, Object data) {
-                bindVariableNames.add(node.getBindVariableQName());
-            }
-        }, null);
+        try {
+            qomTree.accept(new DefaultTraversingQOMTreeVisitor() {
+                public Object visit(BindVariableValueImpl node, Object data) {
+                    bindVariableNames.add(node.getBindVariableQName());
+                    return data;
+                }
+            }, null);
+        } catch (Exception e) {
+            // will never happen
+        }
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java Fri Sep  7 09:09:59 2007
@@ -45,7 +45,7 @@
  * but will calculate the matching documents itself. That way a
  * <code>TooManyClauses</code> can be avoided.
  */
-public class RangeQuery extends Query implements TransformConstants {
+public class RangeQuery extends Query implements Transformable {
 
     /**
      * Logger instance for this class.
@@ -73,7 +73,7 @@
      * How the term enum is transformed before it is compared to lower and upper
      * term.
      */
-    private final int transform;
+    private int transform = TRANSFORM_NONE;
 
     /**
      * The rewritten range query or <code>null</code> if the range spans more
@@ -88,6 +88,18 @@
      * @param lowerTerm the lower term of the interval, or <code>null</code>
      * @param upperTerm the upper term of the interval, or <code>null</code>.
      * @param inclusive if <code>true</code> the interval is inclusive.
+     */
+    public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive) {
+        this(lowerTerm, upperTerm, inclusive, TRANSFORM_NONE);
+    }
+
+    /**
+     * Creates a new RangeQuery. The lower or the upper term may be
+     * <code>null</code>, but not both!
+     *
+     * @param lowerTerm the lower term of the interval, or <code>null</code>
+     * @param upperTerm the upper term of the interval, or <code>null</code>.
+     * @param inclusive if <code>true</code> the interval is inclusive.
      * @param transform how term enums are transformed when read from the index.
      */
     public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive, int transform) {
@@ -108,6 +120,13 @@
         this.upperTerm = upperTerm;
         this.inclusive = inclusive;
         this.transform = transform;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setTransformation(int transformation) {
+        this.transform = transformation;
     }
 
     /**

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java?rev=573622&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java Fri Sep  7 09:09:59 2007
@@ -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.core.query.lucene;
+
+/**
+ * <code>Transformable</code> marks queries that can transform the value to
+ * upper- or lower-case.
+ */
+public interface Transformable extends TransformConstants {
+
+    /**
+     * Sets the transformation. Must be one of the following values:
+     * <ul>
+     * <li>{@link #TRANSFORM_LOWER_CASE}</li>
+     * <li>{@link #TRANSFORM_NONE}</li>
+     * <li>{@link #TRANSFORM_UPPER_CASE}</li>
+     * </ul>
+     * @param transformation a transform constant.
+     */
+    public void setTransformation(int transformation);
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Transformable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java Fri Sep  7 09:09:59 2007
@@ -48,7 +48,7 @@
  * <li><code>_</code> : matches exactly one character</li>
  * </ul>
  */
-public class WildcardQuery extends Query implements TransformConstants {
+public class WildcardQuery extends Query implements Transformable {
 
     /**
      * Logger instance for this class.
@@ -74,7 +74,7 @@
      * How property values are tranformed before they are matched using the
      * provided pattern.
      */
-    private final int transform;
+    private int transform = TRANSFORM_NONE;
 
     /**
      * The standard multi term query to execute wildcard queries. This is only
@@ -107,6 +107,13 @@
      */
     public WildcardQuery(String field, String propName, String pattern) {
         this(field, propName, pattern, TRANSFORM_NONE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setTransformation(int transformation) {
+        this.transform = transformation;
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java Fri Sep  7 09:09:59 2007
@@ -40,7 +40,7 @@
      * @param visitor the visitor.
      * @param data    user defined data, which is passed to the visit method.
      */
-    public abstract void accept(QOMTreeVisitor visitor, Object data);
+    public abstract Object accept(QOMTreeVisitor visitor, Object data) throws Exception;
 
     //---------------------------< internal >-----------------------------------
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java Fri Sep  7 09:09:59 2007
@@ -68,7 +68,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java Fri Sep  7 09:09:59 2007
@@ -66,7 +66,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java Fri Sep  7 09:09:59 2007
@@ -69,7 +69,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java Fri Sep  7 09:09:59 2007
@@ -72,7 +72,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java Fri Sep  7 09:09:59 2007
@@ -127,7 +127,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java Fri Sep  7 09:09:59 2007
@@ -94,7 +94,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java?rev=573622&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java Fri Sep  7 09:09:59 2007
@@ -0,0 +1,213 @@
+/*
+ * 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;
+
+/**
+ * <code>DefaultQOMTreeVisitor</code> default implementation of a {@link
+ * QOMTreeVisitor}.
+ */
+public class DefaultQOMTreeVisitor implements QOMTreeVisitor {
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(AndImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(BindVariableValueImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(ChildNodeImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(ChildNodeJoinConditionImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(ColumnImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(ComparisonImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(DescendantNodeImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(DescendantNodeJoinConditionImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(EquiJoinConditionImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(FullTextSearchImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(FullTextSearchScoreImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(JoinImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(LengthImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(LiteralImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(LowerCaseImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(NodeLocalNameImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(NodeNameImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(NotImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(OrderingImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(OrImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(PropertyExistenceImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(PropertyValueImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(QueryObjectModelTree node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(SameNodeImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(SameNodeJoinConditionImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(SelectorImpl node, Object data) throws Exception {
+        return data;
+    }
+
+    /**
+     * Does nothing and returns <code>data</code>.
+     */
+    public Object visit(UpperCaseImpl node, Object data) throws Exception {
+        return data;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultQOMTreeVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultTraversingQOMTreeVisitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultTraversingQOMTreeVisitor.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultTraversingQOMTreeVisitor.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DefaultTraversingQOMTreeVisitor.java Fri Sep  7 09:09:59 2007
@@ -17,194 +17,81 @@
 package org.apache.jackrabbit.core.query.qom;
 
 /**
- * <code>DefaultTraversingQOMTreeVisitor</code>...
+ * <code>DefaultTraversingQOMTreeVisitor</code> default implementation of a
+ * traversing {@link QOMTreeVisitor}.
  */
-public class DefaultTraversingQOMTreeVisitor implements QOMTreeVisitor {
+public class DefaultTraversingQOMTreeVisitor extends DefaultQOMTreeVisitor {
 
     /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on each of the attached constraints of the AND node.
      */
-    public final void visit(AndImpl node, Object data) {
+    public final Object visit(AndImpl node, Object data) throws Exception {
         ((ConstraintImpl) node.getConstraint1()).accept(this, data);
         ((ConstraintImpl) node.getConstraint2()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(BindVariableValueImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(ChildNodeImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(ChildNodeJoinConditionImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(ColumnImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the two operands in the comparison node.
      */
-    public void visit(ComparisonImpl node, Object data) {
+    public Object visit(ComparisonImpl node, Object data) throws Exception {
         ((DynamicOperandImpl) node.getOperand1()).accept(this, data);
         ((StaticOperandImpl) node.getOperand2()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(DescendantNodeImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(DescendantNodeJoinConditionImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(EquiJoinConditionImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(FullTextSearchImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(FullTextSearchScoreImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the two sources and the join condition in the join node.
      */
-    public void visit(JoinImpl node, Object data) {
+    public Object visit(JoinImpl node, Object data) throws Exception {
         ((SourceImpl) node.getRight()).accept(this, data);
         ((SourceImpl) node.getLeft()).accept(this, data);
         ((JoinConditionImpl) node.getJoinCondition()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the property value in the length node.
      */
-    public void visit(LengthImpl node, Object data) {
+    public Object visit(LengthImpl node, Object data) throws Exception {
         ((PropertyValueImpl) node.getPropertyValue()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the dynamic operand in the lower-case node.
      */
-    public void visit(LowerCaseImpl node, Object data) {
+    public Object visit(LowerCaseImpl node, Object data) throws Exception {
         ((DynamicOperandImpl) node.getOperand()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(NodeLocalNameImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(NodeNameImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the constraint in the NOT node.
      */
-    public void visit(NotImpl node, Object data) {
+    public Object visit(NotImpl node, Object data) throws Exception {
         ((ConstraintImpl) node.getConstraint()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the dynamic operand in the ordering node.
      */
-    public void visit(OrderingImpl node, Object data) {
+    public Object visit(OrderingImpl node, Object data) throws Exception {
         ((DynamicOperandImpl) node.getOperand()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on each of the attached constraints of the OR node.
      */
-    public final void visit(OrImpl node, Object data) {
+    public Object visit(OrImpl node, Object data) throws Exception {
         ((ConstraintImpl) node.getConstraint1()).accept(this, data);
         ((ConstraintImpl) node.getConstraint2()).accept(this, data);
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(PropertyExistenceImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(PropertyValueImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the following contained QOM nodes:
      * <ul>
      * <li>Source</li>
@@ -213,7 +100,7 @@
      * <li>Columns</li>
      * </ul>
      */
-    public void visit(QueryObjectModelTree node, Object data) {
+    public Object visit(QueryObjectModelTree node, Object data) throws Exception {
         node.getSource().accept(this, data);
         ConstraintImpl constraint = node.getConstraint();
         if (constraint != null) {
@@ -227,38 +114,14 @@
         for (int i = 0; i < columns.length; i++) {
             columns[i].accept(this, data);
         }
+        return data;
     }
 
     /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(SameNodeImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(SameNodeJoinConditionImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * Does nothing.
-     */
-    public void visit(SelectorImpl node, Object data) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
      * Calls accept on the dynamic operand in the lower-case node.
      */
-    public void visit(UpperCaseImpl node, Object data) {
+    public Object visit(UpperCaseImpl node, Object data) throws Exception {
         ((DynamicOperandImpl) node.getOperand()).accept(this, data);
+        return data;
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java Fri Sep  7 09:09:59 2007
@@ -73,7 +73,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java Fri Sep  7 09:09:59 2007
@@ -72,7 +72,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java Fri Sep  7 09:09:59 2007
@@ -104,7 +104,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java Fri Sep  7 09:09:59 2007
@@ -58,6 +58,28 @@
      *
      * @return the selector name; non-null
      */
+    public QName getSelectorQName() {
+        return selectorName;
+    }
+
+    /**
+     * Gets the name of the property.
+     *
+     * @return the property name if the full-text search scope is a property,
+     *         otherwise null if the full-text search scope is the node (or node
+     *         subtree, in some implementations).
+     */
+    public QName getPropertyQName() {
+        return propertyName;
+    }
+
+    //--------------------------< FullTextSearch >------------------------------
+
+    /**
+     * Gets the name of the selector against which to apply this constraint.
+     *
+     * @return the selector name; non-null
+     */
     public String getSelectorName() {
         return getJCRName(selectorName);
     }
@@ -90,7 +112,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java Fri Sep  7 09:09:59 2007
@@ -55,7 +55,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java Fri Sep  7 09:09:59 2007
@@ -106,7 +106,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java Fri Sep  7 09:09:59 2007
@@ -53,7 +53,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java?rev=573622&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java Fri Sep  7 09:09:59 2007
@@ -0,0 +1,54 @@
+/*
+ * 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 org.apache.jackrabbit.core.query.jsr283.qom.Literal;
+import org.apache.jackrabbit.name.NamePathResolver;
+
+import javax.jcr.Value;
+
+/**
+ * <code>LiteralImpl</code>...
+ */
+public class LiteralImpl extends StaticOperandImpl implements Literal {
+
+    private final Value value;
+
+    public LiteralImpl(NamePathResolver resolver, Value value) {
+        super(resolver);
+        this.value = value;
+    }
+
+    /**
+     * @return the value of this literal.
+     */
+    public Value getValue() {
+        return value;
+    }
+
+    //------------------------< AbstractQOMNode >-------------------------------
+
+    /**
+     * Accepts a <code>visitor</code> and calls the appropriate visit method
+     * depending on the type of this QOM node.
+     *
+     * @param visitor the visitor.
+     */
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java Fri Sep  7 09:09:59 2007
@@ -53,7 +53,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java Fri Sep  7 09:09:59 2007
@@ -55,7 +55,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java Fri Sep  7 09:09:59 2007
@@ -53,7 +53,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java Fri Sep  7 09:09:59 2007
@@ -53,7 +53,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java Fri Sep  7 09:09:59 2007
@@ -68,7 +68,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java Fri Sep  7 09:09:59 2007
@@ -78,7 +78,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java Fri Sep  7 09:09:59 2007
@@ -51,6 +51,26 @@
      *
      * @return the selector name; non-null
      */
+    public QName getSelectorQName() {
+        return selectorName;
+    }
+
+    /**
+     * Gets the name of the property.
+     *
+     * @return the property name; non-null
+     */
+    public QName getPropertyQName() {
+        return propertyName;
+    }
+
+    //------------------------------< PropertyExistence >-----------------------
+
+    /**
+     * Gets the name of the selector against which to apply this constraint.
+     *
+     * @return the selector name; non-null
+     */
     public String getSelectorName() {
         return getJCRName(selectorName);
     }
@@ -72,7 +92,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java?rev=573622&r1=573621&r2=573622&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java Fri Sep  7 09:09:59 2007
@@ -51,6 +51,26 @@
      *
      * @return the selector name; non-null
      */
+    public QName getSelectorQName() {
+        return selectorName;
+    }
+
+    /**
+     * Gets the name of the property.
+     *
+     * @return the property name; non-null
+     */
+    public QName getPropertyQName() {
+        return propertyName;
+    }
+
+    //------------------------------< PropertyValue >---------------------------
+
+    /**
+     * Gets the name of the selector against which to evaluate this operand.
+     *
+     * @return the selector name; non-null
+     */
     public String getSelectorName() {
         return getJCRName(selectorName);
     }
@@ -72,7 +92,7 @@
      *
      * @param visitor the visitor.
      */
-    public void accept(QOMTreeVisitor visitor, Object data) {
-        visitor.visit(this, data);
+    public Object accept(QOMTreeVisitor visitor, Object data) throws Exception {
+        return visitor.visit(this, data);
     }
 }