You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2012/01/04 19:00:18 UTC

svn commit: r1227240 - in /jackrabbit/trunk: jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/ jackrabbit-jcr2dav/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/ jackrabbit-spi/src/main/java/org/apache/...

Author: jukka
Date: Wed Jan  4 18:00:17 2012
New Revision: 1227240

URL: http://svn.apache.org/viewvc?rev=1227240&view=rev
Log:
JCR-3198: Broken handling of outer join results over davex

Return the set of selector names as a part of the response description field along with column names.

For compatibility with earlier clients/servers this new functionality (and extensible) functionality is only enabled when the search request is made with the query language qualified with the JCR WebDAV extension namespace.

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java
    jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryResultRow.java
    jackrabbit/trunk/jackrabbit-spi2dav/pom.xml
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryResultRowImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java Wed Jan  4 18:00:17 2012
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.webdav.DavR
 import org.apache.jackrabbit.webdav.DavServletResponse;
 import org.apache.jackrabbit.webdav.MultiStatus;
 import org.apache.jackrabbit.webdav.MultiStatusResponse;
+import org.apache.jackrabbit.webdav.jcr.ItemResourceConstants;
 import org.apache.jackrabbit.webdav.jcr.JcrDavException;
 import org.apache.jackrabbit.webdav.jcr.JcrDavSession;
 import org.apache.jackrabbit.webdav.search.QueryGrammerSet;
@@ -45,16 +46,10 @@ import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
-import javax.jcr.query.qom.Source;
-import javax.jcr.query.qom.Join;
-import javax.jcr.query.qom.Selector;
-import javax.jcr.query.qom.QueryObjectModel;
 
 import java.util.Map;
-import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
-import java.util.Arrays;
 
 /**
  * <code>SearchResourceImpl</code>...
@@ -81,7 +76,10 @@ public class SearchResourceImpl implemen
             QueryManager qMgr = getRepositorySession().getWorkspace().getQueryManager();
             String[] langs = qMgr.getSupportedQueryLanguages();
             for (String lang : langs) {
-                // todo: define proper namespace
+                // Note: Existing clients already assume that the
+                // query languages returned in the DASL header are
+                // not prefixed with any namespace, so we probably
+                // shouldn't use an explicit namespace here.
                 qgs.addQueryLanguage(lang, Namespace.EMPTY_NAMESPACE);
             }
         } catch (RepositoryException e) {
@@ -97,8 +95,22 @@ public class SearchResourceImpl implemen
      */
     public MultiStatus search(SearchInfo sInfo) throws DavException {
         try {
-            return queryResultToMultiStatus(getQuery(sInfo));
+            QueryResult result = getQuery(sInfo).execute();
 
+            MultiStatus ms = new MultiStatus();
+
+            if (ItemResourceConstants.NAMESPACE.equals(
+                    sInfo.getLanguageNameSpace())) {
+                ms.setResponseDescription(
+                        "Columns: " + encode(result.getColumnNames())
+                        + "\nSelectors: " + encode(result.getSelectorNames()));
+            } else {
+                ms.setResponseDescription(encode(result.getColumnNames()));
+            }
+
+            queryResultToMultiStatus(result, ms);
+
+            return ms;
         } catch (RepositoryException e) {
             throw new JcrDavException(e);
         }
@@ -196,44 +208,34 @@ public class SearchResourceImpl implemen
      * Webdav compatible form.
      * @throws RepositoryException if an error occurs.
      */
-    private MultiStatus queryResultToMultiStatus(Query query)
+    private void queryResultToMultiStatus(QueryResult result, MultiStatus ms)
             throws RepositoryException {
-        QueryResult qResult = query.execute();
-        MultiStatus ms = new MultiStatus();
-
         List<String> columnNames = new ArrayList<String>();
-        columnNames.addAll(Arrays.asList(qResult.getColumnNames()));
-        StringBuffer responseDescription = new StringBuffer();
-        String delim = "";
-        for (String columnName : columnNames) {
-            responseDescription.append(delim);
-            responseDescription.append(ISO9075.encode(columnName));
-            delim = " ";
-        }
-        ms.setResponseDescription(responseDescription.toString());
 
         ValueFactory vf = getRepositorySession().getValueFactory();
         List<RowValue> descr = new ArrayList<RowValue>();
-        for (Iterator<String> it = columnNames.iterator(); it.hasNext(); ) {
-            String columnName = it.next();
+        for (String columnName : result.getColumnNames()) {
             if (!isPathOrScore(columnName)) {
+                columnNames.add(columnName);
                 descr.add(new PlainValue(columnName, null, vf));
-            } else {
-                it.remove();
             }
         }
+
         // add path and score for each selector
-        List<String> sn = new ArrayList<String>();
-        collectSelectorNames(query, qResult, sn);
-        for (String selectorName : sn) {
+        String[] sns = result.getSelectorNames();
+        boolean join = sns.length > 1;
+        for (String selectorName : sns) {
             descr.add(new PathValue(JcrConstants.JCR_PATH, selectorName, vf));
             columnNames.add(JcrConstants.JCR_PATH);
             descr.add(new ScoreValue(JcrConstants.JCR_SCORE, selectorName, vf));
             columnNames.add(JcrConstants.JCR_SCORE);
         }
+
+        int n = 0;
+        String root = getHref("/");
         String[] selectorNames = createSelectorNames(descr);
         String[] colNames = columnNames.toArray(new String[columnNames.size()]);
-        RowIterator rowIter = qResult.getRows();
+        RowIterator rowIter = result.getRows();
         while (rowIter.hasNext()) {
             Row row = rowIter.nextRow();
             List<Value> values = new ArrayList<Value>();
@@ -241,27 +243,49 @@ public class SearchResourceImpl implemen
                 values.add(rv.getValue(row));
             }
 
-            /*
-             * get the path for the first selector and build a webdav compliant
-             * resource path based on it.
-             * 
-             * Use Row#getPath(String) which works for both simple rows and join
-             * rows (in contrast to Row#getPath()).
-             * 
-             * see also https://issues.apache.org/jira/browse/JCR-3089
-             */
-            final String itemPath = row.getPath(sn.get(0));
             // create a new ms-response for this row of the result set
-            DavResourceLocator loc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), itemPath, false);
-            String href = loc.getHref(true);
+            String href;
+            if (join) {
+                // We need a distinct href for each join result row to
+                // allow the MultiStatus response to keep them separate
+                href = root + "?" + n++;
+            } else {
+                href = getHref(row.getPath());
+            }
             MultiStatusResponse resp = new MultiStatusResponse(href, null);
+
             // build the s-r-property
             SearchResultProperty srp = new SearchResultProperty(colNames,
                     selectorNames, values.toArray(new Value[values.size()]));
             resp.add(srp);
             ms.addResponse(resp);
         }
-        return ms;
+    }
+
+    /**
+     * Returns the resource location of the given query result row.
+     * The result rows of join queries have no meaningful single resource
+     * location, so we'll just default to the root node for all such rows.
+     *
+     * @param row query result row
+     * @param join flag to indicate a join query
+     * @return resource location of the row
+     */
+    private String getHref(String path) throws RepositoryException {
+        DavResourceLocator l = locator.getFactory().createResourceLocator(
+                locator.getPrefix(), locator.getWorkspacePath(), path, false);
+        return l.getHref(true);
+    }
+
+    private String encode(String[] names) {
+        StringBuilder builder = new StringBuilder();
+        String delim = "";
+        for (String name : names) {
+            builder.append(delim);
+            builder.append(ISO9075.encode(name));
+            delim = " ";
+        }
+        return builder.toString();
     }
 
     private static String[] createSelectorNames(Iterable<RowValue> rows)
@@ -376,31 +400,4 @@ public class SearchResourceImpl implemen
         }
     }
 
-    private static void collectSelectorNames(Query query,
-                                             QueryResult result,
-                                             List<String> sn) throws RepositoryException {
-        if (query instanceof QueryObjectModel) {
-            QueryObjectModel qom = (QueryObjectModel) query;
-            collectSelectorNames(qom.getSource(), sn);
-        } else {
-            sn.addAll(Arrays.asList(result.getSelectorNames()));
-        }
-    }
-
-    private static void collectSelectorNames(Source source, List<String> sn) {
-        if (source instanceof Join) {
-            collectSelectorNames((Join) source, sn);
-        } else {
-            collectSelectorNames((Selector) source, sn);
-        }
-    }
-
-    private static void collectSelectorNames(Join join, List<String> sn) {
-        collectSelectorNames(join.getLeft(), sn);
-        collectSelectorNames(join.getRight(), sn);
-    }
-
-    private static void collectSelectorNames(Selector s, List<String> sn) {
-        sn.add(s.getSelectorName());
-    }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml Wed Jan  4 18:00:17 2012
@@ -80,13 +80,6 @@
                       org.apache.jackrabbit.test.api.query.CreateQueryTest#testUnknownQueryLanguage
                       <!-- JCR-2533 : missing impl of checkQueryStatement -->
                       org.apache.jackrabbit.test.api.query.qom.BindVariableValueTest
-                      <!-- JCR-2535 : Row.getPath() called with multiple selectors (server-side) -->
-                      org.apache.jackrabbit.test.api.query.qom.ChildNodeJoinConditionTest
-                      org.apache.jackrabbit.test.api.query.qom.ColumnTest#testMultiColumn
-                      org.apache.jackrabbit.test.api.query.qom.DescendantNodeJoinConditionTest
-                      org.apache.jackrabbit.test.api.query.qom.EquiJoinConditionTest
-                      org.apache.jackrabbit.test.api.query.qom.OrderingTest#testMultipleSelectors
-                      org.apache.jackrabbit.test.api.query.qom.SameNodeJoinConditionTest
                       <!-- JCR-2112 : simple versioning not implemented -->
                       org.apache.jackrabbit.test.api.version.simple
                       <!-- JCR-2104 : activities and configuration -->

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java Wed Jan  4 18:00:17 2012
@@ -19,8 +19,6 @@ package org.apache.jackrabbit.jcr2spi.qu
 import org.apache.jackrabbit.jcr2spi.ItemManager;
 import org.apache.jackrabbit.jcr2spi.ManagerProvider;
 import org.apache.jackrabbit.spi.QueryInfo;
-import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.commons.conversion.NameResolver;
 
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
@@ -66,13 +64,7 @@ class QueryResultImpl implements QueryRe
      * {@inheritDoc}
      */
     public String[] getSelectorNames() throws RepositoryException {
-        Name[] names = queryInfo.getSelectorNames();
-        String[] sn = new String[names.length];
-        NameResolver resolver = mgrProvider.getNameResolver();
-        for (int i = 0; i < sn.length; i++) {
-            sn[i] = resolver.getJCRName(names[i]);
-        }
-        return sn;
+        return queryInfo.getSelectorNames();
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java Wed Jan  4 18:00:17 2012
@@ -291,7 +291,7 @@ class RowIteratorImpl implements RowIter
          * @see Row#getNode(String)
          */
         public Node getNode(String selectorName) throws RepositoryException {
-            return getNode(row.getNodeId(resolver.getQName(selectorName)));
+            return getNode(row.getNodeId(selectorName));
         }
 
         /**
@@ -329,7 +329,7 @@ class RowIteratorImpl implements RowIter
          * @see Row#getScore(String)
          */
         public double getScore(String selectorName) throws RepositoryException {
-            return row.getScore(resolver.getQName(selectorName));
+            return row.getScore(selectorName);
         }
 
         /**

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java Wed Jan  4 18:00:17 2012
@@ -17,6 +17,8 @@
 package org.apache.jackrabbit.spi;
 
 import javax.jcr.RangeIterator;
+import javax.jcr.RepositoryException;
+
 import java.util.Map;
 
 /**
@@ -46,9 +48,9 @@ public interface QueryInfo {
     public String[] getColumnNames();
 
     /**
-     * @return an array of <code>Name</code>s representing the selector names of
+     * @return an array of <code>String</code>s representing the selector names of
      *         the query result.
      * @see javax.jcr.query.QueryResult#getSelectorNames()
      */
-    public Name[] getSelectorNames();
+    public String[] getSelectorNames();
 }

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryResultRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryResultRow.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryResultRow.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QueryResultRow.java Wed Jan  4 18:00:17 2012
@@ -35,7 +35,7 @@ public interface QueryResultRow {
      * @see javax.jcr.query.Row#getNode()
      * @see javax.jcr.query.Row#getNode(String)
      */
-    public NodeId getNodeId(Name selectorName);
+    public NodeId getNodeId(String selectorName);
 
     /**
      * Returns score for the given <code>selectorName</code> of this result row.
@@ -44,7 +44,7 @@ public interface QueryResultRow {
      *                     default selector.
      * @return score for the given selector in this result row.
      */
-    public double getScore(Name selectorName);
+    public double getScore(String selectorName);
 
     /**
      * Returns an array of <code>QValue</code>s.

Modified: jackrabbit/trunk/jackrabbit-spi2dav/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/pom.xml?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/pom.xml Wed Jan  4 18:00:17 2012
@@ -77,13 +77,6 @@
                   org.apache.jackrabbit.test.api.query.CreateQueryTest#testUnknownQueryLanguage
                   <!-- JCR-2533 : missing impl of checkQueryStatement -->
                   org.apache.jackrabbit.test.api.query.qom.BindVariableValueTest
-                  <!-- JCR-2535 : Row.getPath() called with multiple selectors (server-side) -->
-                  org.apache.jackrabbit.test.api.query.qom.ChildNodeJoinConditionTest
-                  org.apache.jackrabbit.test.api.query.qom.ColumnTest#testMultiColumn
-                  org.apache.jackrabbit.test.api.query.qom.DescendantNodeJoinConditionTest
-                  org.apache.jackrabbit.test.api.query.qom.EquiJoinConditionTest
-                  org.apache.jackrabbit.test.api.query.qom.OrderingTest#testMultipleSelectors
-                  org.apache.jackrabbit.test.api.query.qom.SameNodeJoinConditionTest
                   <!-- JCR-2112 : simple versioning not implemented -->
                   org.apache.jackrabbit.test.api.version.simple
                   <!-- JCR-2104 : activities and configuration -->

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java Wed Jan  4 18:00:17 2012
@@ -18,8 +18,6 @@ package org.apache.jackrabbit.spi2dav;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.ValueFactory;
@@ -29,26 +27,24 @@ import org.apache.jackrabbit.spi.QueryIn
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.QueryResultRow;
 import org.apache.jackrabbit.spi.IdFactory;
-import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO9075;
 import org.apache.jackrabbit.webdav.MultiStatus;
 import org.apache.jackrabbit.webdav.MultiStatusResponse;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * <code>QueryInfoImpl</code>...
  */
 public class QueryInfoImpl implements QueryInfo {
 
-    /**
-     * Logger instance for this class.
-     */
-    private static final Logger log = LoggerFactory.getLogger(QueryInfoImpl.class);
+    private static final String COLUMNS = "Columns: ";
+
+    private static final String SELECTORS = "Selectors: ";
+
+    private final List<String> columnNames = new ArrayList<String>();
 
-    private final String[] columnNames;
+    private final List<String> selectorNames = new ArrayList<String>();
 
     private final List<QueryResultRow> results = new ArrayList<QueryResultRow>();
 
@@ -58,23 +54,45 @@ public class QueryInfoImpl implements Qu
         throws RepositoryException {
 
         String responseDescription = ms.getResponseDescription();
-        if (responseDescription != null) {
-            String[] cn = responseDescription.split(" ");
-            this.columnNames = new String[cn.length];
-            for (int i = 0; i < cn.length; i++) {
-                columnNames[i] = ISO9075.decode(cn[i]);
+        if (responseDescription == null) {
+            throw new RepositoryException(
+                    "Missing column infos: Unable to build QueryInfo object.");
+        }
+        if (responseDescription.startsWith(COLUMNS)) {
+            for (String line : responseDescription.split("\n")) {
+                if (line.startsWith(COLUMNS)) {
+                    decode(line.substring(COLUMNS.length()), columnNames);
+                } else if (line.startsWith(SELECTORS)) {
+                    decode(line.substring(SELECTORS.length()), selectorNames);
+                }
             }
         } else {
-            throw new RepositoryException("Missing column infos: Unable to build QueryInfo object.");
+            // Backwards compatibility with old servers that only provide
+            // the list of columns as the response description
+            decode(responseDescription, columnNames);
         }
 
         for (MultiStatusResponse response : ms.getResponses()) {
-            results.add(new QueryResultRowImpl(response, columnNames, resolver,
+            results.add(new QueryResultRowImpl(
+                    response, getColumnNames(), resolver,
                     qValueFactory, valueFactory, idFactory));
         }
     }
 
     /**
+     * Splits the given string at spaces and ISO9075-decodes the parts.
+     *
+     * @param string source string
+     * @param list where the decoded parts get added
+     */
+    private void decode(String string, List<String> list) {
+        String[] parts = string.split(" ");
+        for (int i = 0; i < parts.length; i++) {
+            list.add(ISO9075.decode(parts[i]));
+        }
+    }
+
+    /**
      * @see QueryInfo#getRows()
      */
     public RangeIterator getRows() {
@@ -85,27 +103,13 @@ public class QueryInfoImpl implements Qu
      * @see QueryInfo#getColumnNames()
      */
     public String[] getColumnNames() {
-        String[] names = new String[columnNames.length];
-        System.arraycopy(columnNames, 0, names, 0, columnNames.length);
-        return names;
+        return columnNames.toArray(new String[columnNames.size()]);
     }
 
     /**
      * @see QueryInfo#getSelectorNames()
      */
-    public Name[] getSelectorNames() {
-        if (results.isEmpty()) {
-            // TODO: this is not correct
-            return Name.EMPTY_ARRAY;
-        } else {
-            Set<Name> uniqueNames = new HashSet<Name>();
-            QueryResultRowImpl row = (QueryResultRowImpl) results.get(0);
-            for (Name n : row.getSelectorNames()) {
-                if (n != null) {
-                    uniqueNames.add(n);
-                }
-            }
-            return uniqueNames.toArray(new Name[uniqueNames.size()]);
-        }
+    public String[] getSelectorNames() {
+        return selectorNames.toArray(new String[selectorNames.size()]);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java Wed Jan  4 18:00:17 2012
@@ -29,7 +29,6 @@ import org.apache.jackrabbit.commons.web
 import org.apache.jackrabbit.commons.webdav.QueryUtil;
 import org.apache.jackrabbit.spi.QueryResultRow;
 import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.IdFactory;
@@ -54,16 +53,14 @@ public class QueryResultRowImpl implemen
 
     private static final DavPropertyName SEARCH_RESULT_PROPERTY = DavPropertyName.create(JcrRemotingConstants.JCR_QUERY_RESULT_LN, ItemResourceConstants.NAMESPACE);
 
-    private final Map<Name, NodeId> nodeIds = new HashMap<Name, NodeId>();
+    private final Map<String, NodeId> nodeIds = new HashMap<String, NodeId>();
 
-    private final Map<Name, Double> scores = new HashMap<Name, Double>();
+    private final Map<String, Double> scores = new HashMap<String, Double>();
 
     private final Map<String, QValue> qValues = new HashMap<String, QValue>();
 
     private final String[] columnNames;
 
-    private final Name[] selectorNames;
-
     public QueryResultRowImpl(MultiStatusResponse response,
                               String[] columnNames,
                               NamePathResolver resolver,
@@ -72,6 +69,7 @@ public class QueryResultRowImpl implemen
                               IdFactory idFactory)
             throws RepositoryException {
         this.columnNames = columnNames;
+
         DavPropertySet okSet = response.getProperties(DavServletResponse.SC_OK);
 
         String jcrPath = resolver.getJCRName(NameConstants.JCR_PATH);
@@ -86,24 +84,22 @@ public class QueryResultRowImpl implemen
         String[] names = colList.toArray(new String[colList.size()]);
         Value[] values = valList.toArray(new Value[valList.size()]);
 
-        this.selectorNames = new Name[selList.size()];
         for (int i = 0; i < values.length; i++) {
             try {
                 String selectorName = selList.get(i);
                 QValue v = (values[i] == null) ? null : ValueFormat.getQValue(values[i], resolver, qValueFactory);
-                this.selectorNames[i] = (selectorName == null) ? null : resolver.getQName(selectorName);
                 if (jcrScore.equals(names[i])) {
                     Double score = 0.0;
                     if (v != null) {
                         score = v.getDouble();
                     }
-                    scores.put(this.selectorNames[i], score);
+                    scores.put(selectorName, score);
                 } else if (jcrPath.equals(names[i])) {
                     NodeId id = null;
                     if (v != null) {
                         id = idFactory.createNodeId((String) null, v.getPath());
                     }
-                    nodeIds.put(this.selectorNames[i], id);
+                    nodeIds.put(selectorName, id);
                 }
                 qValues.put(names[i], v);
             } catch (RepositoryException e) {
@@ -113,26 +109,26 @@ public class QueryResultRowImpl implemen
         }
     }
 
-    public NodeId getNodeId(Name selectorName) {
+    public NodeId getNodeId(String selectorName) {
+        if (selectorName == null && scores.size() == 1) {
+            return nodeIds.values().iterator().next();
+        }
+
         NodeId id = nodeIds.get(selectorName);
-        if (id == null) {
-            if (nodeIds.size() == 1) {
-                return nodeIds.values().iterator().next();
-            } else {
-                throw new IllegalArgumentException(selectorName + " is not a valid selectorName");
-            }
+        if (id == null && !nodeIds.containsKey(selectorName)) {
+            throw new IllegalArgumentException(selectorName + " is not a valid selectorName");
         }
         return id;
     }
 
-    public double getScore(Name selectorName) {
+    public double getScore(String selectorName) {
+        if (selectorName == null && scores.size() == 1) {
+            return scores.values().iterator().next();
+        }
+
         Double score = scores.get(selectorName);
-        if (score == null) {
-            if (scores.size() == 1) {
-                return scores.values().iterator().next();
-            } else {
-                throw new IllegalArgumentException(selectorName + " is not a valid selectorName");
-            }
+        if (score == null && !nodeIds.containsKey(selectorName)) {
+            throw new IllegalArgumentException(selectorName + " is not a valid selectorName");
         }
         return score;
     }
@@ -145,7 +141,4 @@ public class QueryResultRowImpl implemen
         return values;
     }
 
-    Name[] getSelectorNames() {
-        return selectorNames;
-    }
 }

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Wed Jan  4 18:00:17 2012
@@ -1945,8 +1945,9 @@ public class RepositoryServiceImpl imple
         SearchMethod method = null;
         try {
             String uri = uriResolver.getWorkspaceUri(sessionInfo.getWorkspaceName());
-            SearchInfo sInfo = new SearchInfo(language,
-                    Namespace.EMPTY_NAMESPACE, statement, namespaces);
+            SearchInfo sInfo = new SearchInfo(
+                    language, ItemResourceConstants.NAMESPACE,
+                    statement, namespaces);
 
             if (limit != -1) {
                 sInfo.setNumberResults(limit);

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryInfoImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryInfoImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryInfoImpl.java Wed Jan  4 18:00:17 2012
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.spi2jcr;
 
 import org.apache.jackrabbit.spi.QueryInfo;
 import org.apache.jackrabbit.spi.QValueFactory;
-import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.RangeIteratorDecorator;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
@@ -30,8 +29,6 @@ import javax.jcr.query.Row;
 import javax.jcr.RepositoryException;
 import javax.jcr.RangeIterator;
 import java.util.NoSuchElementException;
-import java.util.List;
-import java.util.Arrays;
 
 /**
  * <code>QueryInfoImpl</code> implements a <code>QueryInfo</code> based on a
@@ -72,7 +69,7 @@ class QueryInfoImpl implements QueryInfo
     /**
      * The names of the selectors in the query result.
      */
-    private final Name[] selectorNames;
+    private final String[] selectorNames;
 
     /**
      * Creates a new query info based on a given <code>result</code>.
@@ -94,7 +91,7 @@ class QueryInfoImpl implements QueryInfo
         this.resolver = resolver;
         this.qValueFactory = qValueFactory;
         this.columnNames = result.getColumnNames();
-        this.selectorNames = getSelectorNames(result, resolver);
+        this.selectorNames = result.getSelectorNames();
     }
 
     /**
@@ -125,28 +122,14 @@ class QueryInfoImpl implements QueryInfo
      * {@inheritDoc}
      */
     public String[] getColumnNames() {
-        String[] names = new String[columnNames.length];
-        System.arraycopy(columnNames, 0, names, 0, columnNames.length);
-        return names;
+        return columnNames;
     }
 
     /**
      * {@inheritDoc}
      */
-    public Name[] getSelectorNames() {
-        Name[] names = new Name[selectorNames.length];
-        System.arraycopy(selectorNames, 0, names, 0, selectorNames.length);
-        return names;
-    }
-
-    private static Name[] getSelectorNames(QueryResult result,
-                                           NamePathResolver resolver)
-            throws RepositoryException {
-        List<String> sn = Arrays.asList(result.getSelectorNames());
-        Name[] selectorNames = new Name[sn.size()];
-        for (int i = 0; i < sn.size(); i++) {
-            selectorNames[i] = resolver.getQName(sn.get(i));
-        }
+    public String[] getSelectorNames() {
         return selectorNames;
     }
+
 }

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryResultRowImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryResultRowImpl.java?rev=1227240&r1=1227239&r2=1227240&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryResultRowImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QueryResultRowImpl.java Wed Jan  4 18:00:17 2012
@@ -26,7 +26,6 @@ import org.apache.jackrabbit.spi.QueryRe
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
-import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 
@@ -44,12 +43,12 @@ class QueryResultRowImpl implements Quer
     /**
      * The node ids of the underlying row.
      */
-    private final Map<Name, NodeId> nodeIds = new HashMap<Name, NodeId>();
+    private final Map<String, NodeId> nodeIds = new HashMap<String, NodeId>();
 
     /**
      * The score values for this row.
      */
-    private final Map<Name, Double> scores = new HashMap<Name, Double>();
+    private final Map<String, Double> scores = new HashMap<String, Double>();
 
     /**
      * The QValues for this row.
@@ -70,7 +69,7 @@ class QueryResultRowImpl implements Quer
      */
     public QueryResultRowImpl(Row row,
                               String[] columnNames,
-                              Name[] selectorNames,
+                              String[] selectorNames,
                               IdFactoryImpl idFactory,
                               NamePathResolver resolver,
                               QValueFactory qValueFactory) throws RepositoryException {
@@ -83,21 +82,20 @@ class QueryResultRowImpl implements Quer
                 values[i] = ValueFormat.getQValue(v, resolver, qValueFactory);
             }
         }
-        List<Name> selNames = new ArrayList<Name>();
+        List<String> selNames = new ArrayList<String>();
         selNames.addAll(Arrays.asList(selectorNames));
         if (selNames.isEmpty()) {
             selNames.add(null); // default selector
         }
-        for (Name sn : selNames) {
+        for (String sn : selNames) {
             Node n;
             double score;
             if (sn == null) {
                 n = row.getNode();
                 score = row.getScore();
             } else {
-                String selName = resolver.getJCRName(sn);
-                n = row.getNode(selName);
-                score = row.getScore(selName);
+                n = row.getNode(sn);
+                score = row.getScore(sn);
             }
             NodeId id = null;
             if (n != null) {
@@ -108,7 +106,7 @@ class QueryResultRowImpl implements Quer
         }
     }
 
-    public NodeId getNodeId(Name selectorName) {
+    public NodeId getNodeId(String selectorName) {
         if (nodeIds.containsKey(selectorName)) {
             return nodeIds.get(selectorName);
         } else {
@@ -120,7 +118,7 @@ class QueryResultRowImpl implements Quer
         }
     }
 
-    public double getScore(Name selectorName) {
+    public double getScore(String selectorName) {
         Double score;
         if (scores.containsKey(selectorName)) {
             score = scores.get(selectorName);