Skip to content

Commit e5e906d

Browse files
committed
fix: correct array handling in poliglot script executor, issue #10532
1 parent 56446b4 commit e5e906d

2 files changed

Lines changed: 49 additions & 18 deletions

File tree

core/src/main/java/com/orientechnologies/orient/core/command/script/OPolyglotScriptExecutor.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.orientechnologies.orient.core.metadata.function.OFunction;
1313
import com.orientechnologies.orient.core.metadata.security.ORole;
1414
import com.orientechnologies.orient.core.metadata.security.ORule;
15-
import com.orientechnologies.orient.core.sql.executor.OResultInternal;
1615
import com.orientechnologies.orient.core.sql.executor.OResultSet;
1716
import java.util.ArrayList;
1817
import java.util.HashMap;
@@ -168,23 +167,7 @@ public Object executeFunction(
168167

169168
Value result = ctx.eval(language, scriptManager.getFunctionInvoke(f, args));
170169

171-
Object finalResult;
172-
if (result.isNull()) {
173-
finalResult = null;
174-
} else if (result.hasArrayElements()) {
175-
final List<Object> array = new ArrayList<>((int) result.getArraySize());
176-
for (int i = 0; i < result.getArraySize(); ++i)
177-
array.add(new OResultInternal(result.getArrayElement(i).asHostObject()));
178-
finalResult = array;
179-
} else if (result.isHostObject()) {
180-
finalResult = result.asHostObject();
181-
} else if (result.isString()) {
182-
finalResult = result.asString();
183-
} else if (result.isNumber()) {
184-
finalResult = result.asDouble();
185-
} else {
186-
finalResult = result;
187-
}
170+
Object finalResult = toObject(result);
188171
scriptManager.unbind(null, bindings, null, null);
189172
return finalResult;
190173
} catch (PolyglotException e) {
@@ -197,6 +180,27 @@ public Object executeFunction(
197180
}
198181
}
199182

183+
protected Object toObject(Value result) {
184+
Object finalResult;
185+
if (result.isNull()) {
186+
finalResult = null;
187+
} else if (result.hasArrayElements()) {
188+
final List<Object> array = new ArrayList<>((int) result.getArraySize());
189+
for (int i = 0; i < result.getArraySize(); ++i)
190+
array.add(toObject(result.getArrayElement(i)));
191+
finalResult = array;
192+
} else if (result.isHostObject()) {
193+
finalResult = result.asHostObject();
194+
} else if (result.isString()) {
195+
finalResult = result.asString();
196+
} else if (result.isNumber()) {
197+
finalResult = result.asDouble();
198+
} else {
199+
finalResult = transformer.toResult(result);
200+
}
201+
return finalResult;
202+
}
203+
200204
@Override
201205
public void close(String iDatabaseName) {
202206
OResourcePool<ODatabaseDocumentInternal, Context> contextPool =

core/src/test/java/com/orientechnologies/orient/core/command/script/JSScriptTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.orientechnologies.orient.core.db.OrientDB;
77
import com.orientechnologies.orient.core.db.OrientDBInternal;
88
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
9+
import com.orientechnologies.orient.core.metadata.function.OFunction;
910
import com.orientechnologies.orient.core.sql.executor.OResult;
1011
import com.orientechnologies.orient.core.sql.executor.OResultSet;
1112
import java.io.IOException;
@@ -295,4 +296,30 @@ public void jsSandboxWithOrient() {
295296
orientDB.close();
296297
}
297298
}
299+
300+
@Test
301+
public void jsFunctionArray() throws IOException {
302+
final OrientDB orientDB =
303+
OCreateDatabaseUtil.createDatabase("test", "embedded:", OCreateDatabaseUtil.TYPE_MEMORY);
304+
final ODatabaseDocument db =
305+
orientDB.open("test", "admin", OCreateDatabaseUtil.NEW_ADMIN_PASSWORD);
306+
try {
307+
OFunction func = db.getMetadata().getFunctionLibrary().createFunction("testFunction");
308+
func.setLanguage("javascript");
309+
func.setCode(
310+
" \n"
311+
+ "\n"
312+
+ "// Convert to JS native array\n"
313+
+ "var jsList = [];\n"
314+
+ "for (var i = 0; i < 10; i++) {\n"
315+
+ " jsList.push(i);\n"
316+
+ "}\n"
317+
+ "\n"
318+
+ "return jsList;");
319+
func.execute();
320+
} finally {
321+
orientDB.drop("test");
322+
}
323+
orientDB.close();
324+
}
298325
}

0 commit comments

Comments
 (0)