From b4d9367326f958b4a5510b1f6fb49170bbd19715 Mon Sep 17 00:00:00 2001 From: penghuo Date: Mon, 24 Aug 2020 21:13:21 -0700 Subject: [PATCH] Optimize filter expression script --- .../script/filter/ExpressionFilterScript.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/elasticsearch/src/main/java/com/amazon/opendistroforelasticsearch/sql/elasticsearch/storage/script/filter/ExpressionFilterScript.java b/elasticsearch/src/main/java/com/amazon/opendistroforelasticsearch/sql/elasticsearch/storage/script/filter/ExpressionFilterScript.java index 31908cd1f4..08cb490080 100644 --- a/elasticsearch/src/main/java/com/amazon/opendistroforelasticsearch/sql/elasticsearch/storage/script/filter/ExpressionFilterScript.java +++ b/elasticsearch/src/main/java/com/amazon/opendistroforelasticsearch/sql/elasticsearch/storage/script/filter/ExpressionFilterScript.java @@ -56,22 +56,34 @@ class ExpressionFilterScript extends FilterScript { */ private final Expression expression; + /** + * ElasticsearchExprValueFactory. + */ + @EqualsAndHashCode.Exclude + private final ElasticsearchExprValueFactory valueFactory; + + /** + * Reference Fields. + */ + @EqualsAndHashCode.Exclude + private final Set fields; + public ExpressionFilterScript(Expression expression, SearchLookup lookup, LeafReaderContext context, Map params) { super(params, lookup, context); this.expression = expression; + this.fields = AccessController.doPrivileged((PrivilegedAction>) () -> + extractFields(expression)); + this.valueFactory = + AccessController.doPrivileged( + (PrivilegedAction) () -> buildValueFactory(fields)); } @Override public boolean execute() { - // Check current script are not being called by unprivileged code. - SpecialPermission.check(); - return AccessController.doPrivileged((PrivilegedAction) () -> { - Set fields = extractFields(expression); - ElasticsearchExprValueFactory valueFactory = buildValueFactory(fields); Environment valueEnv = buildValueEnv(fields, valueFactory); ExprValue result = evaluateExpression(valueEnv); return (Boolean) result.value();