001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */package org.apache.lucene.search.function;
017:
018: import org.apache.lucene.index.IndexReader;
019: import org.apache.lucene.search.FieldCache;
020:
021: import java.io.IOException;
022:
023: /**
024: * Expert: obtains the ordinal of the field value from the default Lucene
025: * {@link org.apache.lucene.search.FieldCache FieldCache} using getStringIndex()
026: * and reverses the order.
027: * <p>
028: * The native lucene index order is used to assign an ordinal value for each field value.
029: * <p>
030: * Field values (terms) are lexicographically ordered by unicode value, and numbered starting at 1.
031: * <br>
032: * Example of reverse ordinal (rord):
033: * <br>If there were only three field values: "apple","banana","pear"
034: * <br>then rord("apple")=3, rord("banana")=2, ord("pear")=1
035: * <p>
036: * WARNING:
037: * rord() depends on the position in an index and can thus change
038: * when other documents are inserted or deleted,
039: * or if a MultiSearcher is used.
040: *
041: * <p><font color="#FF0000">
042: * WARNING: The status of the <b>search.function</b> package is experimental.
043: * The APIs introduced here might change in the future and will not be
044: * supported anymore in such a case.</font>
045: *
046: * @author yonik
047: */
048:
049: public class ReverseOrdFieldSource extends ValueSource {
050: public String field;
051:
052: /**
053: * Contructor for a certain field.
054: * @param field field whose values reverse order is used.
055: */
056: public ReverseOrdFieldSource(String field) {
057: this .field = field;
058: }
059:
060: /*(non-Javadoc) @see org.apache.lucene.search.function.ValueSource#description() */
061: public String description() {
062: return "rord(" + field + ')';
063: }
064:
065: /*(non-Javadoc) @see org.apache.lucene.search.function.ValueSource#getValues(org.apache.lucene.index.IndexReader) */
066: public DocValues getValues(IndexReader reader) throws IOException {
067: final FieldCache.StringIndex sindex = FieldCache.DEFAULT
068: .getStringIndex(reader, field);
069:
070: final int arr[] = sindex.order;
071: final int end = sindex.lookup.length;
072:
073: return new DocValues() {
074: /*(non-Javadoc) @see org.apache.lucene.search.function.DocValues#floatVal(int) */
075: public float floatVal(int doc) {
076: return (float) (end - arr[doc]);
077: }
078:
079: /* (non-Javadoc) @see org.apache.lucene.search.function.DocValues#intVal(int) */
080: public int intVal(int doc) {
081: return end - arr[doc];
082: }
083:
084: /* (non-Javadoc) @see org.apache.lucene.search.function.DocValues#strVal(int) */
085: public String strVal(int doc) {
086: // the string value of the ordinal, not the string itself
087: return Integer.toString(intVal(doc));
088: }
089:
090: /*(non-Javadoc) @see org.apache.lucene.search.function.DocValues#toString(int) */
091: public String toString(int doc) {
092: return description() + '=' + strVal(doc);
093: }
094:
095: /*(non-Javadoc) @see org.apache.lucene.search.function.DocValues#getInnerArray() */
096: Object getInnerArray() {
097: return arr;
098: }
099: };
100: }
101:
102: /*(non-Javadoc) @see java.lang.Object#equals(java.lang.Object) */
103: public boolean equals(Object o) {
104: if (o.getClass() != ReverseOrdFieldSource.class)
105: return false;
106: ReverseOrdFieldSource other = (ReverseOrdFieldSource) o;
107: return this .field.equals(other.field);
108: }
109:
110: private static final int hcode = ReverseOrdFieldSource.class
111: .hashCode();
112:
113: /*(non-Javadoc) @see java.lang.Object#hashCode() */
114: public int hashCode() {
115: return hcode + field.hashCode();
116: }
117: }
|