Skip to content

Commit 237eef5

Browse files
committed
Draft decay
1 parent 8682c18 commit 237eef5

File tree

8 files changed

+1444
-16
lines changed

8 files changed

+1444
-16
lines changed

server/src/main/java/org/elasticsearch/script/ScoreScriptUtils.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import java.time.ZoneId;
2525
import java.time.ZonedDateTime;
26+
import java.time.temporal.ChronoUnit;
27+
import java.time.temporal.TemporalAmount;
2628

2729
import static com.carrotsearch.hppc.BitMixer.mix32;
2830

@@ -95,7 +97,10 @@ public static final class DecayGeoLinear {
9597
double scaling;
9698

9799
public DecayGeoLinear(String originStr, String scaleStr, String offsetStr, double decay) {
98-
GeoPoint origin = GeoUtils.parseGeoPoint(originStr, false);
100+
this(GeoUtils.parseGeoPoint(originStr, false), scaleStr, offsetStr, decay);
101+
}
102+
103+
public DecayGeoLinear(GeoPoint origin, String scaleStr, String offsetStr, double decay) {
99104
double scale = DistanceUnit.DEFAULT.parse(scaleStr, DistanceUnit.DEFAULT);
100105
this.originLat = origin.lat();
101106
this.originLon = origin.lon();
@@ -117,7 +122,10 @@ public static final class DecayGeoExp {
117122
double scaling;
118123

119124
public DecayGeoExp(String originStr, String scaleStr, String offsetStr, double decay) {
120-
GeoPoint origin = GeoUtils.parseGeoPoint(originStr, false);
125+
this(GeoUtils.parseGeoPoint(originStr, false), scaleStr, offsetStr, decay);
126+
}
127+
128+
public DecayGeoExp(GeoPoint origin, String scaleStr, String offsetStr, double decay) {
121129
double scale = DistanceUnit.DEFAULT.parse(scaleStr, DistanceUnit.DEFAULT);
122130
this.originLat = origin.lat();
123131
this.originLon = origin.lon();
@@ -139,7 +147,10 @@ public static final class DecayGeoGauss {
139147
double scaling;
140148

141149
public DecayGeoGauss(String originStr, String scaleStr, String offsetStr, double decay) {
142-
GeoPoint origin = GeoUtils.parseGeoPoint(originStr, false);
150+
this(GeoUtils.parseGeoPoint(originStr, false), scaleStr, offsetStr, decay);
151+
}
152+
153+
public DecayGeoGauss(GeoPoint origin, String scaleStr, String offsetStr, double decay) {
143154
double scale = DistanceUnit.DEFAULT.parse(scaleStr, DistanceUnit.DEFAULT);
144155
this.originLat = origin.lat();
145156
this.originLon = origin.lon();
@@ -232,6 +243,13 @@ public DecayDateLinear(String originStr, String scaleStr, String offsetStr, doub
232243
this.scaling = scale / (1.0 - decay);
233244
}
234245

246+
public DecayDateLinear(long origin, TemporalAmount scale, TemporalAmount offset, double decay) {
247+
this.origin = origin;
248+
long scaleMillis = temporalAmountToMillis(scale);
249+
this.offset = temporalAmountToMillis(offset);
250+
this.scaling = scaleMillis / (1.0 - decay);
251+
}
252+
235253
public double decayDateLinear(ZonedDateTime docValueDate) {
236254
long docValue = docValueDate.toInstant().toEpochMilli();
237255
// as java.lang.Math#abs(long) is a forbidden API, have to use this comparison instead
@@ -255,6 +273,13 @@ public DecayDateExp(String originStr, String scaleStr, String offsetStr, double
255273
this.scaling = Math.log(decay) / scale;
256274
}
257275

276+
public DecayDateExp(long origin, TemporalAmount scale, TemporalAmount offset, double decay) {
277+
this.origin = origin;
278+
long scaleMillis = temporalAmountToMillis(scale);
279+
this.offset = temporalAmountToMillis(offset);
280+
this.scaling = Math.log(decay) / scaleMillis;
281+
}
282+
258283
public double decayDateExp(ZonedDateTime docValueDate) {
259284
long docValue = docValueDate.toInstant().toEpochMilli();
260285
long diff = (docValue >= origin) ? (docValue - origin) : (origin - docValue);
@@ -277,11 +302,23 @@ public DecayDateGauss(String originStr, String scaleStr, String offsetStr, doubl
277302
this.scaling = 0.5 * Math.pow(scale, 2.0) / Math.log(decay);
278303
}
279304

305+
public DecayDateGauss(long origin, TemporalAmount scale, TemporalAmount offset, double decay) {
306+
this.origin = origin;
307+
long scaleMillis = temporalAmountToMillis(scale);
308+
this.offset = temporalAmountToMillis(offset);
309+
this.scaling = 0.5 * Math.pow(scaleMillis, 2.0) / Math.log(decay);
310+
}
311+
280312
public double decayDateGauss(ZonedDateTime docValueDate) {
281313
long docValue = docValueDate.toInstant().toEpochMilli();
282314
long diff = (docValue >= origin) ? (docValue - origin) : (origin - docValue);
283315
long distance = Math.max(0, diff - offset);
284316
return Math.exp(0.5 * Math.pow(distance, 2.0) / scaling);
285317
}
286318
}
319+
320+
private static long temporalAmountToMillis(TemporalAmount temporalAmount) {
321+
return temporalAmount.get(ChronoUnit.SECONDS) * 1_000 + temporalAmount.get(ChronoUnit.NANOS) / 1_000_000;
322+
}
323+
287324
}

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public enum ParamOrdinal {
3131
SECOND,
3232
THIRD,
3333
FOURTH,
34-
FIFTH;
34+
FIFTH,
35+
SIXTH;
3536

3637
public static ParamOrdinal fromIndex(int index) {
3738
return switch (index) {
@@ -40,6 +41,7 @@ public static ParamOrdinal fromIndex(int index) {
4041
case 2 -> THIRD;
4142
case 3 -> FOURTH;
4243
case 4 -> FIFTH;
44+
case 5 -> SIXTH;
4345
default -> DEFAULT;
4446
};
4547
}

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/EvalOperator.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,66 @@ public String toString() {
110110
}
111111
};
112112
private static final String CONSTANT_NULL_NAME = "ConstantNull";
113+
114+
public static ExpressionEvaluator.Factory DoubleFactory(double value) {
115+
return new ExpressionEvaluator.Factory() {
116+
@Override
117+
public ExpressionEvaluator get(DriverContext driverContext) {
118+
return new ExpressionEvaluator() {
119+
@Override
120+
public Block eval(Page page) {
121+
return driverContext.blockFactory().newConstantDoubleBlockWith(value, page.getPositionCount());
122+
}
123+
124+
@Override
125+
public void close() {
126+
127+
}
128+
129+
@Override
130+
public String toString() {
131+
return CONSTANT_DOUBLE_NAME + "[" + value + "]";
132+
}
133+
};
134+
}
135+
136+
@Override
137+
public String toString() {
138+
return CONSTANT_DOUBLE_NAME + "[" + value + "]";
139+
}
140+
};
141+
}
142+
143+
private static final String CONSTANT_DOUBLE_NAME = "ConstantDouble";
144+
145+
public static ExpressionEvaluator.Factory BytesRefFactory(org.apache.lucene.util.BytesRef value) {
146+
return new ExpressionEvaluator.Factory() {
147+
@Override
148+
public ExpressionEvaluator get(DriverContext driverContext) {
149+
return new ExpressionEvaluator() {
150+
@Override
151+
public Block eval(Page page) {
152+
return driverContext.blockFactory().newConstantBytesRefBlockWith(value, page.getPositionCount());
153+
}
154+
155+
@Override
156+
public void close() {
157+
158+
}
159+
160+
@Override
161+
public String toString() {
162+
return CONSTANT_BYTES_REF_NAME + "[" + value.utf8ToString() + "]";
163+
}
164+
};
165+
}
166+
167+
@Override
168+
public String toString() {
169+
return CONSTANT_BYTES_REF_NAME + "[" + value.utf8ToString() + "]";
170+
}
171+
};
172+
}
173+
174+
private static final String CONSTANT_BYTES_REF_NAME = "ConstantBytesRef";
113175
}
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
###############################################
2+
# Tests for DecayLinear function
3+
#
4+
5+
intLinear
6+
7+
ROW value = 5, origin = 10, scale = 10
8+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "linear")
9+
| KEEP decay_result;
10+
11+
decay_result:double
12+
0.75
13+
;
14+
15+
intExp
16+
17+
ROW value = 5, origin = 10, scale = 10
18+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "exp")
19+
| KEEP decay_result;
20+
21+
decay_result:double
22+
0.7071067811865475
23+
;
24+
25+
intGauss
26+
27+
ROW value = 5, origin = 10, scale = 10
28+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "gauss")
29+
| KEEP decay_result;
30+
31+
decay_result:double
32+
0.8408964152537146
33+
;
34+
35+
intLinearWithOffset
36+
37+
ROW value = 95, origin = 100, scale = 50
38+
| EVAL decay_result = decay(value, origin, scale, 10.0, 0.3, "linear")
39+
| KEEP decay_result;
40+
41+
decay_result:double
42+
1.0
43+
;
44+
45+
intExpWithOffset
46+
47+
ROW value = 120, origin = 100, scale = 50
48+
| EVAL decay_result = decay(value, origin, scale, 5.0, 0.3, "exp")
49+
| KEEP decay_result;
50+
51+
decay_result:double
52+
0.6968453019359488
53+
;
54+
55+
intGaussWithOffset
56+
57+
ROW value = 120, origin = 100, scale = 50
58+
| EVAL decay_result = decay(value, origin, scale, 5.0, 0.3, "gauss")
59+
| KEEP decay_result;
60+
61+
decay_result:double
62+
0.8973067049097825
63+
;
64+
65+
doubleLinear
66+
67+
ROW value = 5.0, origin = 10.0, scale = 10.0
68+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "linear")
69+
| KEEP decay_result;
70+
71+
decay_result:double
72+
0.75
73+
;
74+
75+
doubleExp
76+
77+
ROW value = 5.0, origin = 10.0, scale = 10.0
78+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "exp")
79+
| KEEP decay_result;
80+
81+
decay_result:double
82+
0.7071067811865475
83+
;
84+
85+
doubleGauss
86+
87+
ROW value = 5.0, origin = 10.0, scale = 10.0
88+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "gauss")
89+
| KEEP decay_result;
90+
91+
decay_result:double
92+
0.8408964152537146
93+
;
94+
95+
longLinear
96+
97+
ROW value = 15::long, origin = 10::long, scale = 10::long
98+
| EVAL decay_result = decay(value, origin, scale, 0.0, 0.5, "linear")
99+
| KEEP decay_result;
100+
101+
decay_result:double
102+
0.75
103+
;
104+
105+
cartesianPointLinear1
106+
107+
ROW value = TO_CARTESIANPOINT("POINT(5 5)"), origin = TO_CARTESIANPOINT("POINT(0 0)"), scale = "10m"
108+
| EVAL decay_result = decay(value, origin, scale, "0m", 0.25, "linear")
109+
| KEEP decay_result;
110+
111+
decay_result:double
112+
0.46966991411008935
113+
;
114+
115+
cartesianPointLinear2
116+
117+
ROW value = TO_CARTESIANPOINT("POINT(10 0)"), origin = TO_CARTESIANPOINT("POINT(0 0)"), scale = "10m"
118+
| EVAL decay_result = ROUND(decay(value, origin, scale, "0m", 0.25, "linear"), 10)
119+
| KEEP decay_result;
120+
121+
decay_result:double
122+
0.25
123+
;
124+
125+
cartesianPointLinearWithOffset
126+
127+
ROW value = TO_CARTESIANPOINT("POINT(10 0)"), origin = TO_CARTESIANPOINT("POINT(0 0)"), scale = "10m"
128+
| EVAL decay_result = ROUND(decay(value, origin, scale, "5m", 0.25, "linear"), 10)
129+
| KEEP decay_result;
130+
131+
decay_result:double
132+
0.625
133+
;
134+
135+
136+
geoPointLinear
137+
138+
ROW value = TO_GEOPOINT("POINT(0 0)"), origin = TO_GEOPOINT("POINT(1 1)"), scale = "200km"
139+
| EVAL decay_result = decay(value, origin, scale, "0km", 0.5, "linear")
140+
| KEEP decay_result;
141+
142+
decay_result:double
143+
0.606876005579706
144+
;
145+
146+
datetimeLinear1
147+
148+
ROW value = TO_DATETIME("2023-01-01T00:00:00Z"), origin = TO_DATETIME("2023-01-01T00:00:00Z"), scale = "24 hours"
149+
| EVAL decay_result = decay(value, origin, scale, 0 seconds, 0.5, "linear")
150+
| KEEP decay_result;
151+
152+
decay_result:double
153+
1.0
154+
;
155+
156+
datetimeLinear2
157+
158+
ROW value = TO_DATETIME("2023-01-01T12:00:00Z"), origin = TO_DATETIME("2023-01-01T00:00:00Z"), scale = "24 hours"
159+
| EVAL decay_result = decay(value, origin, scale, "0 seconds", 0.5, "linear")
160+
| KEEP decay_result;
161+
162+
decay_result:double
163+
0.75
164+
;
165+
166+
dateNanosLinear1
167+
168+
ROW value = TO_DATE_NANOS("2023-01-01T00:00:00Z"), origin = TO_DATE_NANOS("2023-01-01T00:00:00Z"), scale = "24 hours"
169+
| EVAL decay_result = decay(value, origin, scale, "0 seconds", 0.5, "linear")
170+
| KEEP decay_result;
171+
172+
decay_result:double
173+
1.0
174+
;
175+
176+
dateNanosLinear2
177+
178+
ROW value = TO_DATE_NANOS("2023-01-01T12:00:00Z"), origin = TO_DATE_NANOS("2023-01-01T00:00:00Z"), scale = "24 hours"
179+
| EVAL decay_result = decay(value, origin, scale, "0 seconds", 0.5, "linear")
180+
| KEEP decay_result;
181+
182+
decay_result:double
183+
0.75
184+
;

0 commit comments

Comments
 (0)