Skip to content

Commit ab8eaa9

Browse files
author
Mark Hale
committed
Improve array literal handling.
1 parent 4a469f5 commit ab8eaa9

5 files changed

Lines changed: 44 additions & 19 deletions

File tree

model/src/main/java/com/msd/gin/halyard/model/AbstractArrayLiteral.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,35 @@ public static AbstractArrayLiteral<?> create(String s) {
6969
throw new IllegalArgumentException(e);
7070
}
7171

72+
return createFromArray(values, componentType);
73+
}
74+
75+
public static AbstractArrayLiteral<?> createFromArray(Object[] arr) {
76+
Class<?> componentType;
77+
int len = arr.length;
78+
if (len == 0) {
79+
componentType = Object.class;
80+
} else {
81+
componentType = arr[0].getClass();
82+
for (int i=1; i<len; i++) {
83+
Class<?> nextType = arr[i].getClass();
84+
if (nextType != componentType) {
85+
componentType = Object.class;
86+
break;
87+
}
88+
}
89+
}
90+
91+
return createFromArray(arr, componentType);
92+
}
93+
94+
private static AbstractArrayLiteral<?> createFromArray(Object[] arr, Class<?> componentType) {
7295
if (componentType == Double.class) {
73-
double[] darr = new double[values.length];
74-
float[] farr = new float[values.length];
96+
double[] darr = new double[arr.length];
97+
float[] farr = new float[arr.length];
7598
componentType = Float.class;
76-
for (int i=0; i<values.length; i++) {
77-
double v = (Double) values[i];
99+
for (int i=0; i<arr.length; i++) {
100+
double v = (Double) arr[i];
78101
float x = (float) v;
79102
darr[i] = v;
80103
farr[i] = x;
@@ -88,7 +111,7 @@ public static AbstractArrayLiteral<?> create(String s) {
88111
return new DoubleArrayLiteral(darr);
89112
}
90113
} else {
91-
return new ObjectArrayLiteral(values, componentType);
114+
return new ObjectArrayLiteral(arr, componentType);
92115
}
93116
}
94117

queryalgebra/src/main/java/com/msd/gin/halyard/query/algebra/evaluation/function/DynamicFunctionRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluation
221221

222222
private static Value toValue(ValueFactory vf, Object v) throws XPathException {
223223
if (v instanceof Object[]) {
224-
return new ObjectArrayLiteral((Object[]) v);
224+
return AbstractArrayLiteral.createFromArray((Object[]) v);
225225
} else if (v instanceof Map<?,?>) {
226226
return new MapLiteral((Map<String,Object>)v);
227227
} else {

sail/src/main/java/com/msd/gin/halyard/sail/search/KNNTupleFunction.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ public CloseableIteration<? extends List<? extends Value>> evaluate(TripleSource
4747
throw new QueryEvaluationException("Invalid query value");
4848
}
4949
int argPos = 0;
50-
Object[] query = ObjectArrayLiteral.objectArray((Literal) args[argPos++]);
51-
Float[] vec = new Float[query.length];
52-
for (int i = 0; i < query.length; i++) {
53-
vec[i] = ((Number) query[i]).floatValue();
50+
Literal queryArg = (Literal) args[argPos++];
51+
Object[] queryArr = ObjectArrayLiteral.objectArray(queryArg);
52+
Float[] vec = new Float[queryArr.length];
53+
for (int i = 0; i < queryArr.length; i++) {
54+
vec[i] = ((Number) queryArr[i]).floatValue();
5455
}
5556
int k = ((Literal) args[argPos++]).intValue();
5657
int numCandidates = ((Literal) args[argPos++]).intValue();
@@ -73,7 +74,7 @@ public CloseableIteration<? extends List<? extends Value>> evaluate(TripleSource
7374
SearchResponse<? extends SearchDocument> searchResults = searchClient.knn(vec, k, numCandidates, minScore, hasAdditionalFields);
7475
return SearchTupleFunction.transformResults(searchResults, matches, valueFactory, rdfFactory);
7576
} catch (ElasticsearchException e) {
76-
LOGGER.error(String.format("Query failed: %s", (Object) query));
77+
LOGGER.error(String.format("Query failed: %s", queryArg));
7778
throw new QueryEvaluationException(e);
7879
} catch (IOException e) {
7980
throw new QueryEvaluationException(e);

sail/src/main/java/com/msd/gin/halyard/sail/search/SearchTupleFunction.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import com.google.common.collect.Lists;
44
import com.msd.gin.halyard.common.RDFFactory;
55
import com.msd.gin.halyard.common.StatementIndices;
6+
import com.msd.gin.halyard.model.AbstractArrayLiteral;
67
import com.msd.gin.halyard.model.FloatArrayLiteral;
7-
import com.msd.gin.halyard.model.ObjectArrayLiteral;
88
import com.msd.gin.halyard.model.ObjectLiteral;
99
import com.msd.gin.halyard.model.vocabulary.HALYARD;
1010
import com.msd.gin.halyard.query.algebra.evaluation.ExtendedTripleSource;
@@ -54,7 +54,8 @@ public CloseableIteration<? extends List<? extends Value>> evaluate(TripleSource
5454
throw new QueryEvaluationException("Invalid query value");
5555
}
5656
int argPos = 0;
57-
String query = ((Literal) args[argPos++]).getLabel();
57+
Literal queryArg = (Literal) args[argPos++];
58+
String query = queryArg.getLabel();
5859
int limit = ((Literal) args[argPos++]).intValue();
5960
double minScore = ((Literal) args[argPos++]).doubleValue();
6061
int fuzziness = ((Literal) args[argPos++]).intValue();
@@ -77,7 +78,7 @@ public CloseableIteration<? extends List<? extends Value>> evaluate(TripleSource
7778
SearchResponse<? extends SearchDocument> searchResults = searchClient.search(query, limit, minScore, fuzziness, phraseSlop, hasAdditionalFields);
7879
return transformResults(searchResults, matches, valueFactory, rdfFactory);
7980
} catch (ElasticsearchException e) {
80-
LOGGER.error(String.format("Query failed: %s", query));
81+
LOGGER.error(String.format("Query failed: %s", queryArg));
8182
throw new QueryEvaluationException(e);
8283
} catch (IOException e) {
8384
throw new QueryEvaluationException(e);
@@ -128,7 +129,7 @@ protected List<Value> convert(List<Hit<? extends SearchDocument>> matchValues) t
128129
} else {
129130
Object v = doc.getAdditionalField(fieldParams.name);
130131
if (v instanceof List<?>) {
131-
l = new ObjectArrayLiteral(((List<?>) v).toArray());
132+
l = AbstractArrayLiteral.createFromArray(((List<?>) v).toArray());
132133
} else if (v != null) {
133134
l = Values.literal(valueFactory, v, false);
134135
} else {

strategy/src/main/java/com/msd/gin/halyard/strategy/MathOpEvaluator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ private static AbstractArrayLiteral<?> operationBetweenVectors(AbstractArrayLite
7171
try {
7272
switch (op) {
7373
case PLUS:
74-
return new ObjectArrayLiteral(add(aarr, barr));
74+
return AbstractArrayLiteral.createFromArray(add(aarr, barr));
7575
case MINUS:
76-
return new ObjectArrayLiteral(subtract(aarr, barr));
76+
return AbstractArrayLiteral.createFromArray(subtract(aarr, barr));
7777
default:
7878
throw new AssertionError("Unsupported operator: " + op);
7979
}
@@ -183,7 +183,7 @@ private static AbstractArrayLiteral<?> operationScalarMultiplyVector(Literal sca
183183
} catch (ClassCastException ex) {
184184
throw new ValueExprEvaluationException(ex);
185185
}
186-
return new ObjectArrayLiteral(y);
186+
return AbstractArrayLiteral.createFromArray(y);
187187
}
188188
}
189189

@@ -223,7 +223,7 @@ private static AbstractArrayLiteral<?> operationVectorDivideScalar(AbstractArray
223223
} catch (ClassCastException ex) {
224224
throw new ValueExprEvaluationException(ex);
225225
}
226-
return new ObjectArrayLiteral(y);
226+
return AbstractArrayLiteral.createFromArray(y);
227227
}
228228
}
229229
}

0 commit comments

Comments
 (0)