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