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.solr.schema;
017:
018: import org.apache.lucene.search.SortField;
019: import org.apache.lucene.search.FieldCache;
020: import org.apache.solr.search.function.ValueSource;
021: import org.apache.solr.search.function.FieldCacheSource;
022: import org.apache.solr.search.function.DocValues;
023: import org.apache.lucene.document.Fieldable;
024: import org.apache.lucene.index.IndexReader;
025: import org.apache.solr.util.NumberUtils;
026: import org.apache.solr.request.XMLWriter;
027: import org.apache.solr.request.TextResponseWriter;
028:
029: import java.util.Map;
030: import java.io.IOException;
031:
032: /**
033: * @author yonik
034: * @version $Id: SortableDoubleField.java 479793 2006-11-27 22:40:21Z klaas $
035: */
036: public class SortableDoubleField extends FieldType {
037: protected void init(IndexSchema schema, Map<String, String> args) {
038: }
039:
040: public SortField getSortField(SchemaField field, boolean reverse) {
041: return getStringSort(field, reverse);
042: }
043:
044: public ValueSource getValueSource(SchemaField field) {
045: return new SortableDoubleFieldSource(field.name);
046: }
047:
048: public String toInternal(String val) {
049: return NumberUtils.double2sortableStr(val);
050: }
051:
052: public String toExternal(Fieldable f) {
053: return indexedToReadable(f.stringValue());
054: }
055:
056: public String indexedToReadable(String indexedForm) {
057: return NumberUtils.SortableStr2doubleStr(indexedForm);
058: }
059:
060: public void write(XMLWriter xmlWriter, String name, Fieldable f)
061: throws IOException {
062: String sval = f.stringValue();
063: xmlWriter.writeDouble(name, NumberUtils
064: .SortableStr2double(sval));
065: }
066:
067: public void write(TextResponseWriter writer, String name,
068: Fieldable f) throws IOException {
069: String sval = f.stringValue();
070: writer.writeDouble(name, NumberUtils.SortableStr2double(sval));
071: }
072: }
073:
074: class SortableDoubleFieldSource extends FieldCacheSource {
075: protected double defVal;
076:
077: public SortableDoubleFieldSource(String field) {
078: this (field, 0.0);
079: }
080:
081: public SortableDoubleFieldSource(String field, double defVal) {
082: super (field);
083: this .defVal = defVal;
084: }
085:
086: public String description() {
087: return "sdouble(" + field + ')';
088: }
089:
090: public DocValues getValues(IndexReader reader) throws IOException {
091: final FieldCache.StringIndex index = cache.getStringIndex(
092: reader, field);
093: final int[] order = index.order;
094: final String[] lookup = index.lookup;
095: final double def = defVal;
096:
097: return new DocValues() {
098: public float floatVal(int doc) {
099: return (float) doubleVal(doc);
100: }
101:
102: public int intVal(int doc) {
103: return (int) doubleVal(doc);
104: }
105:
106: public long longVal(int doc) {
107: return (long) doubleVal(doc);
108: }
109:
110: public double doubleVal(int doc) {
111: int ord = order[doc];
112: return ord == 0 ? def : NumberUtils
113: .SortableStr2double(lookup[ord]);
114: }
115:
116: public String strVal(int doc) {
117: return Double.toString(doubleVal(doc));
118: }
119:
120: public String toString(int doc) {
121: return description() + '=' + doubleVal(doc);
122: }
123: };
124: }
125:
126: public boolean equals(Object o) {
127: return o instanceof SortableDoubleFieldSource
128: && super .equals(o)
129: && defVal == ((SortableDoubleFieldSource) o).defVal;
130: }
131:
132: private static int hcode = SortableDoubleFieldSource.class
133: .hashCode();
134:
135: public int hashCode() {
136: long bits = Double.doubleToLongBits(defVal);
137: int ibits = (int) (bits ^ (bits >>> 32)); // mix upper bits into lower.
138: return hcode + super.hashCode() + ibits;
139: };
140: }
|