From a97dbd3e4b7fbdc725edbd12d79c74eaf6e223cc Mon Sep 17 00:00:00 2001 From: Chen Dai Date: Mon, 21 Nov 2022 10:26:11 -0800 Subject: [PATCH] Add index for dev doc and reorganize Signed-off-by: Chen Dai --- docs/dev/{ => analyzing}/SemanticAnalysis.md | 0 docs/dev/{ => analyzing}/TypeConversion.md | 0 .../opensearch/expression-pushdown.md | 346 ++++++++++++++++++ .../opensearch/pagination.md} | 0 docs/dev/img/expression-pushdown-lucene.png | Bin 0 -> 54762 bytes docs/dev/index.md | 29 ++ .../sql/aggregate-window-function.md} | 0 .../{SubQuery.md => language/sql/subquery.md} | 0 .../architecture.md} | 0 .../sql-engine-v2.md} | 0 docs/dev/{Doctest.md => testing/doctest.md} | 0 docs/dev/{Testing.md => testing/testing.md} | 0 12 files changed, 375 insertions(+) rename docs/dev/{ => analyzing}/SemanticAnalysis.md (100%) rename docs/dev/{ => analyzing}/TypeConversion.md (100%) create mode 100644 docs/dev/datasource/opensearch/expression-pushdown.md rename docs/dev/{Pagination.md => datasource/opensearch/pagination.md} (100%) create mode 100644 docs/dev/img/expression-pushdown-lucene.png create mode 100644 docs/dev/index.md rename docs/dev/{AggregateWindowFunction.md => language/sql/aggregate-window-function.md} (100%) rename docs/dev/{SubQuery.md => language/sql/subquery.md} (100%) rename docs/dev/{Architecture.md => overview/architecture.md} (100%) rename docs/dev/{NewSQLEngine.md => overview/sql-engine-v2.md} (100%) rename docs/dev/{Doctest.md => testing/doctest.md} (100%) rename docs/dev/{Testing.md => testing/testing.md} (100%) diff --git a/docs/dev/SemanticAnalysis.md b/docs/dev/analyzing/SemanticAnalysis.md similarity index 100% rename from docs/dev/SemanticAnalysis.md rename to docs/dev/analyzing/SemanticAnalysis.md diff --git a/docs/dev/TypeConversion.md b/docs/dev/analyzing/TypeConversion.md similarity index 100% rename from docs/dev/TypeConversion.md rename to docs/dev/analyzing/TypeConversion.md diff --git a/docs/dev/datasource/opensearch/expression-pushdown.md b/docs/dev/datasource/opensearch/expression-pushdown.md new file mode 100644 index 0000000000..bbea6cb51a --- /dev/null +++ b/docs/dev/datasource/opensearch/expression-pushdown.md @@ -0,0 +1,346 @@ +# SQL Functions Implementation by a New Expression System + +## 1.Overview + +### 1.1 Problem Statement + +Currently, there were quite a few issues regarding SQL functions reported earlier. Those issues were critical but not easy to fix in the old codebase. Recently this important problem was brought up again in ODBC driver test results. As reported, the SQL function issues, especially missing support for nested function call, failed a large number of test in the total 800+ test cases. This makes SQL function issue top priority and have to be planned to fix soon. + +### 1.2 Expression System in New Query Engine + +This year we have been working on a new query engine architecture. At this moment, we have implemented a few common relational operators and expressions. In future, all the arithmetic operators, logical operators and scalar functions will be built on top of the expression system. These expressions form a closure system mathematically which can be composed flexibly and recursively. + + +>From wikipedia, “A set is **closed** under an operation if performance of that operation on members of the set always produces a member of that set... Similarly, a set is said to be closed under a collection of operations if it is closed under each of the operations individually... (the set) is said to satisfy **closure property**.” In our case, our expression values (ExprValue class) is closed under expression operators defined, including unary/binary logical operator, arithmetic operator and functions. In other word, each of these operators can only output expression value which makes possible composing them in any way to form an expression tree. + + +Given consideration to the advantages of the new architecture, the complexity of old codebase as well as our future plan, we favor supporting SQL functions in new query engine directly over struggling to patch the old codebase. However, one important challenge needs to take is to figure out how to push down expression to Elasticsearch DSL query. + +* * * + +## 2.Requirements + +### 2.1 Functionalities + +According to the GitHub issues reported as well as ODBC driver test results, the following functionalities needs to be taken into account: + +1. **Semantically Consistency**: Each function should have exactly the same meaning as other SQL implementation. This includes the semantics of function argument and return value and their semantic check. +2. **Missing/Null Value Handling**: Each function should be able to handle missing/null value in Elasticsearch document. +3. **Nested Function Call Support**: Each function should be able to be nested with other functions. Tableau seems to rely on this capability heavily. + +### 2.2 Performance + +As aforementioned, function expressions need to be pushed down to Elasticsearch DSL to run inside Elasticsearch computation engine. In relational theory, this push down optimization, especially selection push down, is probably the most common and effective one. + + +>In Elasticsearch, this process is called **Query-Then-Fetch**: “The request is processed in two phases. In the first phase, the query is forwarded to all involved shards. Each shard executes the search and generates a sorted list of results, local to that shard. Each shard returns **just enough information** to the coordinating node to allow it to merge and re-sort the shard level results into a globally sorted set of results...”. So in our case, if expressions pushed down, it would be executed within query phase and reduce the size of result returned significantly. + + +The reason why is this required mostly is obvious that all data would be pulled out otherwise. This either causes out of memory error without circuit breaker protection or ends up with poor performance. + +### 2.3 Security + +When pushed down, we need to be careful about the possibility that attacker injects malicious code in SQL query which in turn executed without permission control. In this case, we need to make use of Elasticsearch script sandbox to rule out security risk. + +* * * + +## 3.Design + +### 3.1 Expression Pushdown + +Similar as the existing operators, it is very straightforward to integrate functions with expression system in the new query engine. Therefore, in this section, the attention is put on approaches for expression push down optimization. + +**Approach 1: Translating to Painless Script** + +This is how we optimized expression in old codebase. + +* Pros: + * Elasticsearch built-in script language. + * Can be used in different places in DSL. +* Cons: + * Need to maintain pipelining Java code or pushed down painless script for each expression. + * Inline Painless script in JAVA code is messy. + * Painless API limitation. (Need to confirm if any SQL function cannot be implemented) + +**Approach 2 (Chosen): Expression as a New Script Language** + +In this approach, we propose to registering a new script language in Elasticsearch. This is feasible and supported by Elasticsearch `ScriptEngine` API. + +* Pros: + * Implement a function expression in JAVA only and get the pushed down version automatically. + * No JAVA byte code generated at runtime which seems how Painless compiles before run. +* Cons: + * Serialized expression may be longer than painless script. Need to check if any limit on max length of DSL. + * CPU consumption may be higher under the assumption that (de-)serialization is more expensive than concatenating Painless script string. + * Built-in JDK serialization requires code changes on all expression classes and lambda. (Need to find better 3rd-party library if necessary). + +### 3.2 Elasticsearch DSL Queries Pushdown + +In the design above, we register our expression as new script language and optimize expression evaluation by pushdown to script query in Elasticsearch DSL. However, in this case, we are not leveraging the Elasticsearch DSL for Lucene queries. For certain filter expressions, it can be optimized further by pushing down to Elasticsearch queries fully or partially. + +This problem can be solved by visiting functions/operators in top down fashion and handle in the following way: + +1. `AND`, `OR`, `NOT`: Translate to bool query and visit left/right side recursively +2. Functions that Lucene may support: Translate to Lucene query if left side is a reference (field name) and right is a literal. Otherwise go to 3. +3. Functions that Elasticsearch query doesn't support or argument is not valid as mentioned in 2: Serialize the expression (subtree with current function node as root) and translate to script query. + +Here is an example to help understand. `AND` is translated to bool filter query directly (case [#1](https://github.com/opendistro-for-elasticsearch/sql/pull/1)). The `name = 'John'` is eligible because `=` can be translated to Lucene term query and left side (first argument) is a reference and right side is a literal (case [#2](https://github.com/opendistro-for-elasticsearch/sql/pull/2)). `ABS(age) = 30` is translated to a script query (case [#3](https://github.com/opendistro-for-elasticsearch/sql/issues/3)). +[Image: lucene-pushdown.png] + +* * * + +## 4.Proof of Concept + +### 4.1 Overview + +Here is the diagram showing how WHERE condition in a SQL query pushed down and handled by our own script engine: +[Image: expressions (3)-Page-3.png] + +### 4.2 Conclusion + +Now let’s look back to see if what we’ve done can meet all the requirements in 2.1 Functionalities: + +1. In base class `SQLFunction`, we handle missing and NULL argument value properly to be consistent with SQL standards. +2. In `Substring` implementation, we perform semantic check. +3. The only remaining item is nested function call. Luckily this is already built in new expression system. Each function we add gets this ability automatically and for free. + +For push down optimization, what we achieved is as follows. Elasticsearch is aware of and able to interpret serialized expression tree in DSL when our own language name “`opendistro_expression`” is specified. + +``` +// Request +{ + "query": "SELECT firstname FROM accounts WHERE **SUBSTRING(SUBSTRING(lastname,0,3),0,1) = 'w'**" +} + +**===> + +**// DSL +{ + "query":{ + "script":{ + "boost":1, + "script":{ + // Serialized expression tree + "source":"rO0ABXNyAF9jb20uYW1hem9uLm9wZW5kaXN0...", + "lang":"opendistro_expression" + } + } + } +} +``` + +### 4.3 Expression + +In this section we implement SQL function `SUBSTRING` for example. This demonstrates that all the functionality required can be taken care of in new expression system. + +**4.3.1 Function Expression Implementation** + +First, we need a base class `SQLFunction` for logic shared by all SQL functions. For example, each SQL function needs to check if any input argument is missing or NULL. If found any, expression evaluation is skipped and instead a missing or NULL is returned respectively. + +``` +public abstract class **SQLFunction** extends FunctionExpression { + ... + + @Override + public ExprValue valueOf(Environment valueEnv) { + List argExprs = getArguments(); + ExprValue[] argValues = new ExprValue[argExprs.size()]; + + for (int i = 0; i < argExprs.size(); i++) { + **ExprValue argValue = argExprs.get(i).valueOf(valueEnv);** + if (argValue.isMissing()) { + return ExprValueUtils.missingValue(); + } + if (argValue.isNull()) { + return ExprValueUtils.nullValue(); + } + argValues[i] = argValue; + } + return valueOf(argValues); + } + + protected abstract ExprValue valueOf(ExprValue[] argValues); + +} +``` + +Now we implement `Substring` as subclass of SQLFunction: + +``` +public class **Substring** extends SQLFunction { + ... + + @Override + protected ExprValue valueOf(ExprValue[] argValues) { + String str = (String) argValues[0].value(); + int start = (int) argValues[1].value(); + int length = (int) argValues[2].value(); + int end = start + length; + + if (!(0 <= start && end <= str.length())) { + throw new SemanticCheckException(String.format( + "Semantic error on arguments: %s." + + "Expect: start is non-negative and start + length is no greater than string length.", + Arrays.toString(argValues))); + } + + String result = str.substring(start, end); + return ExprValueUtils.stringValue(result); + } + + @Override + public ExprType type(Environment typeEnv) { + return ExprType.STRING; + } + +} +``` + +**4.3.2 Register in Function Repository** + +Before using substring function, we need to register this `Substring` in function repository. Accordingly ANTLR grammar needs to be changed too to avoid syntactic error. ***Note that in this PoC we consider SQL functions are dynamic extension to query engine from SQL parser***. That is why we register substring function in `SQLService`. + +``` + public SQLService(SQLSyntaxParser parser, Analyzer analyzer, + StorageEngine storageEngine, ExecutionEngine executionEngine, + BuiltinFunctionRepository functionRepository) { + ... + + registerSQLFunctions(); + } + + private void **registerSQLFunctions**() { + functionRepository.register(substring()); + } + + private FunctionResolver substring() { + return new FunctionResolver( + Substring.FUNCTION_NAME, + ImmutableMap.of( + new FunctionSignature(Substring.FUNCTION_NAME, Arrays.asList(STRING, INTEGER, INTEGER)), + Substring::new // Function builder + ) + ); + } +``` + +### 4.4 Custom Script Engine + +The next challenge is to implement a custom script language engine in Elasticsearch. + +**4.4.1 Expression Serialization** + +Since we can only pass string to Elasticsearch DSL, we need some format to encode the entire expression tree which is a tree of Java object. In this PoC, JDK serialization is in use. A big drawback is it requires everything implements `Serializable` interface which is hassle especially for inner class and lambda. + +``` +public class **ElasticsearchIndexScan** extends TableScanOperator { + ... + + public PhysicalPlan pushDown(LogicalFilter filter) { + request.getSourceBuilder().query( + QueryBuilders.scriptQuery( + new Script( + Script.DEFAULT_SCRIPT_TYPE, + ExpressionScriptEngine.EXPRESSION_LANG_NAME, + **serialize****(filter.getCondition****())**, + emptyMap() + ) + ) + ); + return this; // Assume everything pushed down and nothing needed for physical filter operator + } + + private String serialize(Expression expression) { + try { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + ObjectOutputStream objectOutput = new ObjectOutputStream(output); + objectOutput.writeObject(expression); + objectOutput.flush(); + return Base64.getEncoder().encodeToString(output.toByteArray()); + } catch (IOException e) { + throw new IllegalStateException("Failed to serialize expression: " + expression, e); + } + } +``` + +**4.4.2 Script Factory** + +Because a script is execute on each document in an Elasticsearch index, we need to compile it ahead and store for reuse. ***Note that in fact our expression is already compiled in Analyzer, so what is needed here is deserialization only***. + +``` +public class **ExpressionScriptEngine** implements ScriptEngine { + + public static final String EXPRESSION_LANG_NAME = "opendistro_expression"; + ... + + @Override + public FactoryType compile(String templateName, + String templateSource, + ScriptContext context, + Map params) { + + Expression expression = compile(templateSource); + ExpressionScriptFactory factory = new ExpressionScriptFactory(expression); + return context.factoryClazz.cast(factory); + } + + private Expression compile(String source) { + try { + ByteArrayInputStream input = new ByteArrayInputStream(Base64.getDecoder().decode(source)); + ObjectInputStream objectInput = new ObjectInputStream(input); + return (Expression) objectInput.readObject(); + } catch (Exception e) { + throw new IllegalStateException("Failed to deserialize source: " + source, e); + } + } +``` + +**4.4.3 Script Execution** + +Finally, we implement execute script logic. In our case it is evaluating expression with a value environment. Basically we check which fields are present in expression tree. And then we extract its value from the document being processed. At last we convert the field name and value map to binding tuple and evaluate expression tree on it. + +``` + private static class **ExpressionScript** extends FilterScript { + private final Expression expression; + ... + + @Override + public boolean execute() { + // Check we ourselves are not being called by unprivileged code. + SpecialPermission.check(); + + return AccessController.doPrivileged((PrivilegedAction) () -> { + + // 1) getDoc() is not iterable; 2) Doc value is array; 3) Get text field ends up with exception + Set fieldNames = extractInputFieldNames(); + Map values = extractFieldNameAndValues(fieldNames); + ExprValue result = evaluateExpression(values); + return (Boolean) result.value(); + }); + } + + private ExprValue **evaluateExpression**(Map values) { + ExprValue tupleValue = ExprValueUtils.tupleValue(values); + ExprValue result = expression.valueOf(tupleValue.bindingTuples()); + + if (result.type() != ExprType.BOOLEAN) { + throw new IllegalStateException("Expression has wrong result type: " + result); + } + return result; + } +``` + +**4.4.4 Register Script Engine** + +We have all pieces ready and we can register our script language engine to Elasticsearch now. + +``` +public class SQLPlugin extends Plugin implements ActionPlugin, **ScriptPlugin** { + ... + + @Override + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { + return new **ExpressionScriptEngine**(); + } +} +``` diff --git a/docs/dev/Pagination.md b/docs/dev/datasource/opensearch/pagination.md similarity index 100% rename from docs/dev/Pagination.md rename to docs/dev/datasource/opensearch/pagination.md diff --git a/docs/dev/img/expression-pushdown-lucene.png b/docs/dev/img/expression-pushdown-lucene.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4e6720e7c4e06e54d0939b110e920a0a871e6a GIT binary patch literal 54762 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⁢YI_ca}{iJM#cYq=F6neon^61P1DT=V; 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