Skip to content

Script: int, byte, short fields for Fields API #80316

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,20 @@ class org.elasticsearch.script.field.BooleanDocValuesField @dynamic_type {
boolean get(boolean)
boolean get(int, boolean)
}

class org.elasticsearch.script.field.IntegerDocValuesField @dynamic_type {
int get(int)
int get(int, int)
}

# defaults are cast to short, taking an int facilitates resolution with constants without casting
class org.elasticsearch.script.field.ShortDocValuesField @dynamic_type {
short get(int)
short get(int, int)
}

# defaults are cast to byte, taking an int facilitates resolution with constants without casting
class org.elasticsearch.script.field.ByteDocValuesField @dynamic_type {
byte get(int)
byte get(int, int)
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,16 @@ setup:
token_count:
type: token_count
analyzer: standard
rank:
type: integer


- do:
index:
index: test
id: 1
body:
rank: 1
boolean: true
date: 2017-01-01T12:11:12
geo_point: 41.12,-71.34
Expand All @@ -62,14 +66,19 @@ setup:
index:
index: test
id: 2
body: {}
body:
rank: 2

- do:
index:
index: test
id: 3
body:
rank: 3
boolean: [true, false, true]
integer: [5, 17, 29]
short: [6, 18, 30, 45]
byte: [16, 32, 64, 8, 4]

- do:
indices.refresh: {}
Expand Down Expand Up @@ -109,18 +118,6 @@ setup:
source: "field('boolean').get(false)"
- match: { hits.hits.0.fields.field.0: true }

- do:
search:
rest_total_hits_as_int: true
body:
query: { term: { _id: 1 } }
script_fields:

field:
script:
source: "field('boolean').get(false)"
- match: { hits.hits.0.fields.field.0: true }

- do:
search:
rest_total_hits_as_int: true
Expand Down Expand Up @@ -398,6 +395,44 @@ setup:
source: "doc['integer'].value"
- match: { hits.hits.0.fields.field.0: 134134566 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('integer').get(-1)"
- match: { hits.hits.0.fields.field.0: 134134566 }
- match: { hits.hits.1.fields.field.0: -1 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('integer').get(1, -3)"
- match: { hits.hits.0.fields.field.0: -3 }
- match: { hits.hits.1.fields.field.0: -3 }
- match: { hits.hits.2.fields.field.0: 17 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "int total = 0; for (int i : field('integer')) { total += i; } total + field('integer').size();"
- match: { hits.hits.0.fields.field.0: 134134567 }
- match: { hits.hits.1.fields.field.0: 0 }
- match: { hits.hits.2.fields.field.0: 54 }

---
"short":
- do:
Expand All @@ -422,6 +457,69 @@ setup:
source: "doc['short'].value"
- match: { hits.hits.0.fields.field.0: 1324 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('short').get(-1)"
- match: { hits.hits.0.fields.field.0: 1324 }
- match: { hits.hits.1.fields.field.0: -1 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "short defaultShort = -1; field('short').get(defaultShort)"
- match: { hits.hits.0.fields.field.0: 1324 }
- match: { hits.hits.1.fields.field.0: -1 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('short').get(1, -3)"
- match: { hits.hits.0.fields.field.0: -3 }
- match: { hits.hits.1.fields.field.0: -3 }
- match: { hits.hits.2.fields.field.0: 18 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "short defaultShort = -3; field('short').get(1, defaultShort)"
- match: { hits.hits.0.fields.field.0: -3 }
- match: { hits.hits.1.fields.field.0: -3 }
- match: { hits.hits.2.fields.field.0: 18 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "int total = 0; for (short s : field('short')) { total += s; } total + field('short').size();"
- match: { hits.hits.0.fields.field.0: 1325 }
- match: { hits.hits.1.fields.field.0: 0 }
- match: { hits.hits.2.fields.field.0: 103 }

---
"byte":
- do:
Expand All @@ -446,6 +544,100 @@ setup:
source: "doc['byte'].value"
- match: { hits.hits.0.fields.field.0: 12 }


- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('byte').get((byte) 5)"
- match: { hits.hits.0.fields.field.0: 12 }
- match: { hits.hits.1.fields.field.0: 5 }
- match: { hits.hits.2.fields.field.0: 4 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "byte defaultByte = 5; field('byte').get(defaultByte)"
- match: { hits.hits.0.fields.field.0: 12 }
- match: { hits.hits.1.fields.field.0: 5 }
- match: { hits.hits.2.fields.field.0: 4 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('byte').get(5)"
- match: { hits.hits.0.fields.field.0: 12 }
- match: { hits.hits.1.fields.field.0: 5 }
- match: { hits.hits.2.fields.field.0: 4 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('byte').get(1, (byte) 7)"
- match: { hits.hits.0.fields.field.0: 7 }
- match: { hits.hits.1.fields.field.0: 7 }
- match: { hits.hits.2.fields.field.0: 8 }


- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "byte defaultByte = 7; field('byte').get(1, defaultByte)"
- match: { hits.hits.0.fields.field.0: 7 }
- match: { hits.hits.1.fields.field.0: 7 }
- match: { hits.hits.2.fields.field.0: 8 }


- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "field('byte').get(1, 7)"
- match: { hits.hits.0.fields.field.0: 7 }
- match: { hits.hits.1.fields.field.0: 7 }
- match: { hits.hits.2.fields.field.0: 8 }

- do:
search:
rest_total_hits_as_int: true
body:
sort: [ { rank: asc } ]
script_fields:
field:
script:
source: "int total = 0; for (byte s : field('byte')) { total += s; } total + field('byte').size();"
- match: { hits.hits.0.fields.field.0: 13 }
- match: { hits.hits.1.fields.field.0: 0 }
- match: { hits.hits.2.fields.field.0: 129 }

---
"double":
- do:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.elasticsearch.geometry.utils.Geohash;
import org.elasticsearch.script.field.BinaryDocValuesField;
import org.elasticsearch.script.field.BooleanDocValuesField;
import org.elasticsearch.script.field.SortedNumericDocValuesWrapper;

import java.io.IOException;
import java.time.Instant;
Expand Down Expand Up @@ -78,36 +79,19 @@ protected void throwIfEmpty() {
}

public static final class Longs extends ScriptDocValues<Long> {
private final SortedNumericDocValues in;
private long[] values = new long[0];
private int count;

private final SortedNumericDocValuesWrapper sortedNumericDocValuesWrapper;

/**
* Standard constructor.
*/
public Longs(SortedNumericDocValues in) {
this.in = in;
public Longs(SortedNumericDocValuesWrapper sortedNumericDocValuesWrapper) {
this.sortedNumericDocValuesWrapper = sortedNumericDocValuesWrapper;
}

@Override
public void setNextDocId(int docId) throws IOException {
if (in.advanceExact(docId)) {
resize(in.docValueCount());
for (int i = 0; i < count; i++) {
values[i] = in.nextValue();
}
} else {
resize(0);
}
}

/**
* Set the {@link #size()} and ensure that the {@link #values} array can
* store at least that many entries.
*/
protected void resize(int newSize) {
count = newSize;
values = ArrayUtil.grow(values, count);
sortedNumericDocValuesWrapper.setNextDocId(docId);
}

public long getValue() {
Expand All @@ -117,12 +101,12 @@ public long getValue() {
@Override
public Long get(int index) {
throwIfEmpty();
return values[index];
return sortedNumericDocValuesWrapper.getInternal(index);
}

@Override
public int size() {
return count;
return sortedNumericDocValuesWrapper.size();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@
import org.elasticsearch.index.fielddata.SortedBinaryDocValues;
import org.elasticsearch.index.fielddata.SortedNumericDoubleValues;
import org.elasticsearch.script.field.BooleanDocValuesField;
import org.elasticsearch.script.field.ByteDocValuesField;
import org.elasticsearch.script.field.DelegateDocValuesField;
import org.elasticsearch.script.field.DocValuesField;
import org.elasticsearch.script.field.IntegerDocValuesField;
import org.elasticsearch.script.field.LongDocValuesWrapper;
import org.elasticsearch.script.field.ShortDocValuesField;
import org.elasticsearch.search.DocValueFormat;

import java.io.IOException;
Expand Down Expand Up @@ -58,8 +62,14 @@ public final DocValuesField<?> getScriptField(String name) {
);
case BOOLEAN:
return new BooleanDocValuesField(getLongValues(), name);
case BYTE:
return new ByteDocValuesField(getLongValues(), name);
case SHORT:
return new ShortDocValuesField(getLongValues(), name);
case INT:
return new IntegerDocValuesField(getLongValues(), name);
default:
return new DelegateDocValuesField(new ScriptDocValues.Longs(getLongValues()), name);
return new LongDocValuesWrapper(getLongValues(), name);
}
}

Expand Down
Loading