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