Skip to content

Commit 3840439

Browse files
ubonesskimchy
authored andcommitted
float field data implementation
1 parent 9137fcc commit 3840439

File tree

7 files changed

+1406
-4
lines changed

7 files changed

+1406
-4
lines changed

src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,20 @@ public class IndexFieldDataService extends AbstractIndexComponent {
4545
static {
4646
buildersByType = MapBuilder.<String, IndexFieldData.Builder>newMapBuilder()
4747
.put("string", new ConcreteBytesRefIndexFieldData.Builder())
48+
.put("float", new FloatArrayIndexFieldData.Builder())
4849
.put("double", new DoubleArrayIndexFieldData.Builder())
50+
.put("int", new IntArrayIndexFieldData.Builder())
4951
.put("long", new LongArrayIndexFieldData.Builder())
5052
.put("geo_point", new GeoPointDoubleArrayIndexFieldData.Builder())
51-
.put("int", new IntArrayIndexFieldData.Builder())
5253
.immutableMap();
5354

5455
buildersByTypeAndFormat = MapBuilder.<Tuple<String, String>, IndexFieldData.Builder>newMapBuilder()
5556
.put(Tuple.tuple("string", "concrete_bytes"), new ConcreteBytesRefIndexFieldData.Builder())
57+
.put(Tuple.tuple("float", "array"), new FloatArrayIndexFieldData.Builder())
5658
.put(Tuple.tuple("double", "array"), new DoubleArrayIndexFieldData.Builder())
59+
.put(Tuple.tuple("int", "array"), new IntArrayIndexFieldData.Builder())
5760
.put(Tuple.tuple("long", "array"), new LongArrayIndexFieldData.Builder())
5861
.put(Tuple.tuple("geo_point", "array"), new GeoPointDoubleArrayIndexFieldData.Builder())
59-
.put(Tuple.tuple("int", "array"), new IntArrayIndexFieldData.Builder())
6062
.immutableMap();
6163
}
6264

src/main/java/org/elasticsearch/index/fielddata/StringValues.java

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package org.elasticsearch.index.fielddata;
2121

2222
import org.elasticsearch.ElasticSearchIllegalStateException;
23+
import org.elasticsearch.index.fielddata.util.FloatArrayRef;
24+
import org.elasticsearch.index.fielddata.util.IntArrayRef;
2325
import org.elasticsearch.index.fielddata.util.LongArrayRef;
2426
import org.elasticsearch.index.fielddata.util.StringArrayRef;
2527

@@ -101,6 +103,100 @@ public String next() {
101103
}
102104
}
103105

106+
public static class IntBased implements StringValues {
107+
108+
private final IntValues values;
109+
110+
private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1);
111+
private final ValuesIter valuesIter = new ValuesIter();
112+
private final Proc proc = new Proc();
113+
114+
public IntBased(IntValues values) {
115+
this.values = values;
116+
}
117+
118+
@Override
119+
public boolean isMultiValued() {
120+
return values.isMultiValued();
121+
}
122+
123+
@Override
124+
public boolean hasValue(int docId) {
125+
return values.hasValue(docId);
126+
}
127+
128+
@Override
129+
public String getValue(int docId) {
130+
if (!values.hasValue(docId)) {
131+
return null;
132+
}
133+
return Integer.toString(values.getValue(docId));
134+
}
135+
136+
@Override
137+
public StringArrayRef getValues(int docId) {
138+
IntArrayRef arrayRef = values.getValues(docId);
139+
int size = arrayRef.size();
140+
if (size == 0) return StringArrayRef.EMPTY;
141+
142+
arrayScratch.reset(size);
143+
for (int i = arrayRef.start; i < arrayRef.end; i++) {
144+
arrayScratch.values[arrayScratch.end++] = Integer.toString(arrayRef.values[i]);
145+
}
146+
return arrayScratch;
147+
}
148+
149+
@Override
150+
public Iter getIter(int docId) {
151+
return valuesIter.reset(values.getIter(docId));
152+
}
153+
154+
@Override
155+
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
156+
values.forEachValueInDoc(docId, this.proc.reset(proc));
157+
}
158+
159+
static class ValuesIter implements Iter {
160+
161+
private IntValues.Iter iter;
162+
163+
private ValuesIter reset(IntValues.Iter iter) {
164+
this.iter = iter;
165+
return this;
166+
}
167+
168+
@Override
169+
public boolean hasNext() {
170+
return iter.hasNext();
171+
}
172+
173+
@Override
174+
public String next() {
175+
return Integer.toString(iter.next());
176+
}
177+
}
178+
179+
static class Proc implements IntValues.ValueInDocProc {
180+
181+
private ValueInDocProc proc;
182+
183+
private Proc reset(ValueInDocProc proc) {
184+
this.proc = proc;
185+
return this;
186+
}
187+
188+
@Override
189+
public void onValue(int docId, int value) {
190+
proc.onValue(docId, Integer.toString(value));
191+
}
192+
193+
@Override
194+
public void onMissing(int docId) {
195+
proc.onMissing(docId);
196+
}
197+
}
198+
}
199+
104200
public static class LongBased implements StringValues {
105201

106202
private final LongValues values;
@@ -194,4 +290,99 @@ public void onMissing(int docId) {
194290
}
195291
}
196292
}
293+
294+
public static class FloatBased implements StringValues {
295+
296+
private final FloatValues values;
297+
298+
private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1);
299+
private final ValuesIter valuesIter = new ValuesIter();
300+
private final Proc proc = new Proc();
301+
302+
public FloatBased(FloatValues values) {
303+
this.values = values;
304+
}
305+
306+
@Override
307+
public boolean isMultiValued() {
308+
return values.isMultiValued();
309+
}
310+
311+
@Override
312+
public boolean hasValue(int docId) {
313+
return values.hasValue(docId);
314+
}
315+
316+
@Override
317+
public String getValue(int docId) {
318+
if (!values.hasValue(docId)) {
319+
return null;
320+
}
321+
return Float.toString(values.getValue(docId));
322+
}
323+
324+
@Override
325+
public StringArrayRef getValues(int docId) {
326+
FloatArrayRef arrayRef = values.getValues(docId);
327+
int size = arrayRef.size();
328+
if (size == 0) return StringArrayRef.EMPTY;
329+
330+
arrayScratch.reset(size);
331+
for (int i = arrayRef.start; i < arrayRef.end; i++) {
332+
arrayScratch.values[arrayScratch.end++] = Float.toString(arrayRef.values[i]);
333+
}
334+
return arrayScratch;
335+
}
336+
337+
@Override
338+
public Iter getIter(int docId) {
339+
return valuesIter.reset(values.getIter(docId));
340+
}
341+
342+
@Override
343+
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
344+
values.forEachValueInDoc(docId, this.proc.reset(proc));
345+
}
346+
347+
static class ValuesIter implements Iter {
348+
349+
private FloatValues.Iter iter;
350+
351+
private ValuesIter reset(FloatValues.Iter iter) {
352+
this.iter = iter;
353+
return this;
354+
}
355+
356+
@Override
357+
public boolean hasNext() {
358+
return iter.hasNext();
359+
}
360+
361+
@Override
362+
public String next() {
363+
return Float.toString(iter.next());
364+
}
365+
}
366+
367+
static class Proc implements FloatValues.ValueInDocProc {
368+
369+
private ValueInDocProc proc;
370+
371+
private Proc reset(ValueInDocProc proc) {
372+
this.proc = proc;
373+
return this;
374+
}
375+
376+
@Override
377+
public void onValue(int docId, float value) {
378+
proc.onValue(docId, Float.toString(value));
379+
}
380+
381+
@Override
382+
public void onMissing(int docId) {
383+
proc.onMissing(docId);
384+
}
385+
}
386+
}
387+
197388
}

0 commit comments

Comments
 (0)