diff --git a/pom.xml b/pom.xml index 48e1752b55ab..322fa155176c 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ 1.3 2.5.6-hadoop3 0.7.2 - 15.4 + 23.0.8 3.3.7 4.0.3 @@ -420,9 +420,14 @@ ${commons-math3.version} - org.openjdk.nashorn - nashorn-core - ${nashorn.version} + org.graalvm.js + js-scriptengine + ${graalvm.version} + + + org.graalvm.js + js + ${graalvm.version} io.jsonwebtoken diff --git a/ql/pom.xml b/ql/pom.xml index 63ac5498ede5..9f3d4b20a921 100644 --- a/ql/pom.xml +++ b/ql/pom.xml @@ -33,8 +33,12 @@ - org.openjdk.nashorn - nashorn-core + org.graalvm.js + js-scriptengine + + + org.graalvm.js + js org.apache.atlas diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/PartitionTree.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/PartitionTree.java index 3c1e96172fed..7a34fde78364 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/PartitionTree.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/PartitionTree.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hive.ql.metadata; +import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine; import org.apache.hadoop.hive.metastore.api.AlreadyExistsException; import org.apache.hadoop.hive.metastore.api.GetPartitionsFilterSpec; import org.apache.hadoop.hive.metastore.api.GetPartitionsRequest; @@ -28,11 +29,8 @@ import org.apache.hadoop.hive.metastore.api.PartitionFilterMode; import org.apache.hadoop.hive.metastore.api.PartitionListComposingSpec; import org.apache.hadoop.hive.metastore.api.PartitionSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.graalvm.polyglot.Context; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.util.ArrayList; import java.util.Arrays; @@ -41,7 +39,6 @@ import java.util.List; import java.util.Map; -import static org.apache.hadoop.hive.metastore.Warehouse.LOG; import static org.apache.hadoop.hive.metastore.Warehouse.makePartName; import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.makePartNameMatcher; @@ -50,7 +47,6 @@ * via references. */ final class PartitionTree { - private static final Logger LOG = LoggerFactory.getLogger(PartitionTree.class); private Map parts = new LinkedHashMap<>(); private final org.apache.hadoop.hive.metastore.api.Table tTable; @@ -258,21 +254,20 @@ List getPartitionsByFilter(final String filter) throws MetaException return new ArrayList<>(parts.values()); } List result = new ArrayList<>(); - ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript"); - if (se == null) { - LOG.error("JavaScript script engine is not found, therefore partition filtering " - + "for temporary tables is disabled."); - return result; - } - for (Map.Entry entry : parts.entrySet()) { - se.put("partitionName", entry.getKey()); - se.put("values", entry.getValue().getValues()); - try { - if ((Boolean)se.eval(filter)) { - result.add(entry.getValue()); + try (GraalJSScriptEngine se = GraalJSScriptEngine.create(null, + Context.newBuilder().allowExperimentalOptions(true) + .option("js.nashorn-compat", "true") + .allowAllAccess(true))) { + for (Map.Entry entry : parts.entrySet()) { + se.put("partitionName", entry.getKey()); + se.put("values", entry.getValue().getValues()); + try { + if ((Boolean) se.eval(filter)) { + result.add(entry.getValue()); + } + } catch (ScriptException e) { + throw new MetaException("Incorrect partition filter"); } - } catch (ScriptException e) { - throw new MetaException("Incorrect partition filter"); } } return result; @@ -311,19 +306,17 @@ GetPartitionsResponse getPartitionsWithSpecs(GetPartitionsRequest getPartitionsR matches = filterSpec.getFilters().stream().anyMatch(str -> entry.getValue().getValues().contains(str)); break; case BY_EXPR: - ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript"); - if (se == null) { - LOG.error("JavaScript script engine is not found, therefore partition filtering " - + "for temporary tables is disabled."); - break; - } - - for (String filter : filterSpec.getFilters()) { - try { - se.put("partition", partition); - matches = (Boolean) se.eval(filter); - } catch (ScriptException e) { - throw new MetaException("Error evaluating filter expression: " + e.getMessage()); + try (GraalJSScriptEngine se = GraalJSScriptEngine.create(null, + Context.newBuilder().allowExperimentalOptions(true) + .option("js.nashorn-compat", "true") + .allowAllAccess(true))) { + for (String filter : filterSpec.getFilters()) { + try { + se.put("partition", partition); + matches = (Boolean) se.eval(filter); + } catch (ScriptException e) { + throw new MetaException("Error evaluating filter expression: " + e.getMessage()); + } } } break;