/*
* 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.exoplatform.services.jcr.impl.core.query.lucene;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import java.io.IOException;
/**
* <code>ScoreNode</code> implements a simple container which holds a mapping
* of NodeId to a score value.
*/
public final class ScoreNode {
/**
* The id of a node.
*/
private final String id;
/**
* The score of the node.
*/
private final float score;
/**
* The lucene document number for this score node. Set to <code>-1</code> if
* unknown.
*/
private final int doc;
/**
* Creates a new <code>ScoreNode</code>.
*
* @param id the node id.
* @param score the score value.
*/
public ScoreNode(String id, float score) {
this(id, score, -1);
}
/**
* Creates a new <code>ScoreNode</code>.
*
* @param id the node id.
* @param score the score value.
* @param doc the document number.
*/
public ScoreNode(String id, float score, int doc) {
this.id = id;
this.score = score;
this.doc = doc;
}
/**
* @return the node id for this <code>ScoreNode</code>.
*/
public String getNodeId() {
return id;
}
/**
* @return the score for this <code>ScoreNode</code>.
*/
public float getScore() {
return score;
}
/**
* Returns the document number for this score node.
*
* @param reader the current index reader to look up the document if
* needed.
* @return the document number.
* @throws IOException if an error occurs while reading from the index or
* the node is not present in the index.
*/
public int getDoc(IndexReader reader) throws IOException {
if (doc == -1) {
TermDocs docs = reader.termDocs(new Term(FieldNames.UUID, id.toString()));
try {
if (docs.next()) {
return docs.doc();
} else {
throw new IOException("Node with id " + id + " not found in index");
}
} finally {
docs.close();
}
} else {
return doc;
}
}
public String toString() {
StringBuilder sb = new StringBuilder(id.toString());
sb.append("(");
if (doc != -1) {
sb.append(doc);
} else {
sb.append("?");
}
sb.append(")");
return sb.toString();
}
}