public StructuredRetrieval(StructuredIndex index, Parameters factoryParameters) {
   this.index = index;
   Parameters featureParameters = factoryParameters.clone();
   featureParameters.add("collectionLength", Long.toString(index.getCollectionLength()));
   featureParameters.add("documentCount", Long.toString(index.getDocumentCount()));
   featureFactory = new FeatureFactory(featureParameters);
 }
  /**
   * Evaluates a query.
   *
   * @param queryTree A query tree that has been already transformed with
   *     StructuredRetrieval.transformQuery.
   * @param requested The number of documents to retrieve, at most.
   * @return
   * @throws java.lang.Exception
   */
  public ScoredDocument[] runQuery(Node queryTree, int requested) throws Exception {

    // my addition
    queryTree = this.transformQuery(queryTree);

    // System.out.println("runQuery: " + queryTree.toString());

    // construct the query iterators
    ScoreIterator iterator = (ScoreIterator) createIterator(queryTree);

    // now there should be an iterator at the root of this tree
    PriorityQueue<ScoredDocument> queue = new PriorityQueue<ScoredDocument>();

    while (!iterator.isDone()) {
      int document = iterator.nextCandidate();
      int length = index.getLength(document);
      double score = iterator.score(document, length);

      if (queue.size() <= requested || queue.peek().score < score) {
        ScoredDocument scoredDocument = new ScoredDocument(document, score);
        queue.add(scoredDocument);

        if (queue.size() > requested) {
          queue.poll();
        }
      }

      iterator.movePast(document);
    }

    return getArrayResults(queue);
  }
 public NodeType getNodeType(Node node) throws Exception {
   NodeType nodeType = index.getNodeType(node);
   if (nodeType == null) {
     nodeType = featureFactory.getNodeType(node);
   }
   return nodeType;
 }
  public StructuredIterator createIterator(Node node) throws Exception {
    ArrayList<StructuredIterator> internalIterators = new ArrayList<StructuredIterator>();

    for (Node internalNode : node.getInternalNodes()) {
      StructuredIterator internalIterator = createIterator(internalNode);
      internalIterators.add(internalIterator);
    }

    StructuredIterator iterator = index.getIterator(node);
    if (iterator == null) {
      iterator = featureFactory.getIterator(node, internalIterators);
    }

    return iterator;
  }
 public void close() throws IOException {
   index.close();
 }
 public String getDocumentName(int document) {
   return index.getDocumentName(document);
 }