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: SortableFloatField.java 479793 2006-11-27 22:40:21Z klaas $
035: */
036: public class SortableFloatField 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 SortableFloatFieldSource(field.name);
046: }
047:
048: public String toInternal(String val) {
049: return NumberUtils.float2sortableStr(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.SortableStr2floatStr(indexedForm);
058: }
059:
060: public void write(XMLWriter xmlWriter, String name, Fieldable f)
061: throws IOException {
062: String sval = f.stringValue();
063: xmlWriter.writeFloat(name, NumberUtils.SortableStr2float(sval));
064: }
065:
066: public void write(TextResponseWriter writer, String name,
067: Fieldable f) throws IOException {
068: String sval = f.stringValue();
069: writer.writeFloat(name, NumberUtils.SortableStr2float(sval));
070: }
071: }
072:
073: class SortableFloatFieldSource extends FieldCacheSource {
074: protected float defVal;
075:
076: public SortableFloatFieldSource(String field) {
077: this (field, 0.0f);
078: }
079:
080: public SortableFloatFieldSource(String field, float defVal) {
081: super (field);
082: this .defVal = defVal;
083: }
084:
085: public String description() {
086: return "sfloat(" + field + ')';
087: }
088:
089: public DocValues getValues(IndexReader reader) throws IOException {
090: final FieldCache.StringIndex index = cache.getStringIndex(
091: reader, field);
092: final int[] order = index.order;
093: final String[] lookup = index.lookup;
094: final float def = defVal;
095:
096: return new DocValues() {
097: public float floatVal(int doc) {
098: int ord = order[doc];
099: return ord == 0 ? def : NumberUtils
100: .SortableStr2float(lookup[ord]);
101: }
102:
103: public int intVal(int doc) {
104: return (int) floatVal(doc);
105: }
106:
107: public long longVal(int doc) {
108: return (long) floatVal(doc);
109: }
110:
111: public double doubleVal(int doc) {
112: return (double) floatVal(doc);
113: }
114:
115: public String strVal(int doc) {
116: return Float.toString(floatVal(doc));
117: }
118:
119: public String toString(int doc) {
120: return description() + '=' + floatVal(doc);
121: }
122: };
123: }
124:
125: public boolean equals(Object o) {
126: return o instanceof SortableFloatFieldSource && super .equals(o)
127: && defVal == ((SortableFloatFieldSource) o).defVal;
128: }
129:
130: private static int hcode = SortableFloatFieldSource.class
131: .hashCode();
132:
133: public int hashCode() {
134: return hcode + super.hashCode() + Float.floatToIntBits(defVal);
135: };
136: }
|