OrientDB Server Side JavaScript Function: Iterating over array (arraylist)

Viewed 28

OrientDB Version: 3.2.6

I wish to create an OrientDB server-side function which zips two arrays into an object, but also format the values (which are always record ids) slightly.

Function name:

idToRidMap

Takes args:

keys - An array of strings representing the keys of the resulting object, Example: ["id1", "id2"]
values - An array of record ids, Example: [#15:1, #15:2] 

Returns an object with the id array elements as keys and the record ids as string values without leading "#", i.e. from examples above it would be:

{
  "id1": "15:1",
  "id2": "15:2"
}

I wish to use this function in queries like this one:

SELECT idToRidMap(configIds, configRids) as configs, * FROM (
   SELECT outE("HasConfig").id as configIds, out("HasConfig").@rid as configRids, * FROM 12:0
)

So, depending on the id of the linking Edges and the record-id of the linked Vertices I wish to build one property showing all those relations in the returned record:

{
   "@rid": "#12:0",
   "someNativeProp": "Hello",
   "configs": {
       "id1": "15:1",
       "id2": "15:2"
   },
   ...
}

Note though, that this would also require me to drop the projections for the intermediate array results as well, extending the query to be something like this:

SELECT idToRidMap(configIds, configRids) as configs, !configIds, !configRids, * FROM (
   SELECT outE("HasConfig").id as configIds, out("HasConfig").@rid as configRids, * FROM 12:0
)

The OrientDB JS function definition I've tried (among many others) is:

var result = {};
for (i = 0; i < keys.length; i++) {
  result[keys[i]] = String(values[i]).replace('#', '');
}
return result;

But I realized that length is not available (it is undefined) on the keys argument. When testing by using keys.size() (guessing it was java.util.arraylist) I was given an error:

com.orientechnologies.orient.core.command.script.OCommandScriptException: Error on parsing script at position #0: Error on execution of the script Script: idToRidMap ------^ DB name="test" --> javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (size) on java.util.ArrayList@1b395482 failed due to: Unknown identifier: size --> org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (size) on java.util.ArrayList@1b395482 failed due to: Unknown identifier: size

Which seems to indicate that it has something to do with graalvm polyglot and that it indeed has to do with java.util.ArrayList. I did check https://www.graalvm.org/22.1/reference-manual/js/JavaInteroperability/#access-java-from-javascript but I'm not sure how relevant it is and I didn't find anything that helped me.

So, to sum up. Basically there's two parts to this question:

  • Is there any documentation of how the JavaScript server-side functions work type-wise and syntax-wise, etc? It seems really picky to what kind of JavaScript I write as well. How can I do the desired iterations to implement my function?

  • Is there a better way of achieving my end goal?

Thankful for any insight, I've always had a hard time with OrientDB custom functions.

0 Answers
Related