blob: 96fb62b42484c87edd53e983c8950d2cfa367581 [file] [log] [blame]
/*
* 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;
}
}