/* * 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.spi2jcr; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; import java.util.Arrays; import org.apache.jackrabbit.spi.QueryResultRow; import org.apache.jackrabbit.spi.NodeId; import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.QValueFactory; import org.apache.jackrabbit.spi.commons.value.ValueFormat; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import javax.jcr.query.Row; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.Node; /** * <code>QueryResultRowImpl</code> implements a <code>QueryResultRow</code> * based on a JCR {@link javax.jcr.query.Row}. */ class QueryResultRowImpl implements QueryResultRow { /** * The node ids of the underlying row. */ private final Map<String, NodeId> nodeIds = new HashMap<String, NodeId>(); /** * The score values for this row. */ private final Map<String, Double> scores = new HashMap<String, Double>(); /** * The QValues for this row. */ private final QValue[] values; /** * Creates a new query result row for the given <code>row</code>. * * @param row the JCR row. * @param columnNames the resolved names of the columns. * @param selectorNames the selector names. * @param idFactory the id factory. * @param resolver the name path resolver. * @param qValueFactory the QValue factory. * @throws RepositoryException if an error occurs while reading from * <code>row</code>. */ public QueryResultRowImpl(Row row, String[] columnNames, String[] selectorNames, IdFactoryImpl idFactory, NamePathResolver resolver, QValueFactory qValueFactory) throws RepositoryException { this.values = new QValue[columnNames.length]; for (int i = 0; i < columnNames.length; i++) { Value v = row.getValue(columnNames[i]); if (v == null) { values[i] = null; } else { values[i] = ValueFormat.getQValue(v, resolver, qValueFactory); } } List<String> selNames = new ArrayList<String>(); selNames.addAll(Arrays.asList(selectorNames)); if (selNames.isEmpty()) { selNames.add(null); // default selector } for (String sn : selNames) { Node n; double score; if (sn == null) { n = row.getNode(); score = row.getScore(); } else { n = row.getNode(sn); score = row.getScore(sn); } NodeId id = null; if (n != null) { id = idFactory.fromJcrIdentifier(n.getIdentifier()); } nodeIds.put(sn, id); scores.put(sn, score); } } public NodeId getNodeId(String selectorName) { if (nodeIds.containsKey(selectorName)) { return nodeIds.get(selectorName); } else { if (nodeIds.size() == 1) { return nodeIds.values().iterator().next(); } else { throw new IllegalArgumentException(selectorName + " is not a valid selectorName"); } } } public double getScore(String selectorName) { Double score; if (scores.containsKey(selectorName)) { score = scores.get(selectorName); } else { if (scores.size() == 1) { score = scores.values().iterator().next(); } else { throw new IllegalArgumentException(selectorName + " is not a valid selectorName"); } } if (score == null) { return Double.NaN; } else { return score; } } /** * {@inheritDoc} */ public QValue[] getValues() { QValue[] vals = new QValue[values.length]; System.arraycopy(values, 0, vals, 0, values.length); return vals; } }