waynexia commented on PR #6604: URL: https://github.com/apache/arrow-datafusion/pull/6604#issuecomment-1586780824
@alamb's suggestion makes sense to me. For `NOT IN` there is no direct corresponding expression, maybe we can wrap an `Expr::Not` over `SingularOrList`. Interestingly, I inspected the official java implementation of substrait via its cli tool [Isthmus](https://github.com/substrait-io/substrait-java/blob/main/isthmus/README.md), it seems like they don't use `SingularOrList` as well. Don't know the reason. But through the doc it's applicable to use `SingularOrList` here. Here is the result I get from `SELECT a FROM t where a IN ('a', 'b')` and `SELECT a FROM t where a not IN ('a', 'b')`: <details> <summary> `SELECT a FROM t where a IN ('a', 'b')` </summary> ```json { "extensionUris": [{ "extensionUriAnchor": 1, "uri": "/functions_boolean.yaml" }, { "extensionUriAnchor": 2, "uri": "/functions_comparison.yaml" }], "extensions": [{ "extensionFunction": { "extensionUriReference": 1, "functionAnchor": 0, "name": "or:bool" } }, { "extensionFunction": { "extensionUriReference": 2, "functionAnchor": 1, "name": "equal:any_any" } }], "relations": [{ "root": { "input": { "project": { "common": { "emit": { "outputMapping": [3] } }, "input": { "filter": { "common": { "direct": { } }, "input": { "read": { "common": { "direct": { } }, "baseSchema": { "names": ["A", "B", "C"], "struct": { "types": [{ "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }], "typeVariationReference": 0, "nullability": "NULLABILITY_REQUIRED" } }, "namedTable": { "names": ["T"] } } }, "condition": { "scalarFunction": { "functionReference": 0, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "scalarFunction": { "functionReference": 1, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } } }, { "value": { "cast": { "type": { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "input": { "literal": { "fixedChar": "a", "nullable": false, "typeVariationReference": 0 } }, "failureBehavior": "FAILURE_BEHAVIOR_UNSPECIFIED" } } }], "options": [] } } }, { "value": { "scalarFunction": { "functionReference": 1, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } } }, { "value": { "cast": { "type": { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "input": { "literal": { "fixedChar": "b", "nullable": false, "typeVariationReference": 0 } }, "failureBehavior": "FAILURE_BEHAVIOR_UNSPECIFIED" } } }], "options": [] } } }], "options": [] } } } }, "expressions": [{ "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } }] } }, "names": ["A"] } }], "expectedTypeUrls": [] } ``` </details> <details> <summary> `SELECT a FROM t where a not IN ('a', 'b')` </summary> ```json { "extensionUris": [{ "extensionUriAnchor": 1, "uri": "/functions_boolean.yaml" }, { "extensionUriAnchor": 2, "uri": "/functions_comparison.yaml" }], "extensions": [{ "extensionFunction": { "extensionUriReference": 1, "functionAnchor": 0, "name": "not:bool" } }, { "extensionFunction": { "extensionUriReference": 1, "functionAnchor": 1, "name": "or:bool" } }, { "extensionFunction": { "extensionUriReference": 2, "functionAnchor": 2, "name": "equal:any_any" } }], "relations": [{ "root": { "input": { "project": { "common": { "emit": { "outputMapping": [3] } }, "input": { "filter": { "common": { "direct": { } }, "input": { "read": { "common": { "direct": { } }, "baseSchema": { "names": ["A", "B", "C"], "struct": { "types": [{ "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }], "typeVariationReference": 0, "nullability": "NULLABILITY_REQUIRED" } }, "namedTable": { "names": ["T"] } } }, "condition": { "scalarFunction": { "functionReference": 0, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "scalarFunction": { "functionReference": 1, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "scalarFunction": { "functionReference": 2, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } } }, { "value": { "cast": { "type": { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "input": { "literal": { "fixedChar": "a", "nullable": false, "typeVariationReference": 0 } }, "failureBehavior": "FAILURE_BEHAVIOR_UNSPECIFIED" } } }], "options": [] } } }, { "value": { "scalarFunction": { "functionReference": 2, "args": [], "outputType": { "bool": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "arguments": [{ "value": { "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } } }, { "value": { "cast": { "type": { "string": { "typeVariationReference": 0, "nullability": "NULLABILITY_NULLABLE" } }, "input": { "literal": { "fixedChar": "b", "nullable": false, "typeVariationReference": 0 } }, "failureBehavior": "FAILURE_BEHAVIOR_UNSPECIFIED" } } }], "options": [] } } }], "options": [] } } }], "options": [] } } } }, "expressions": [{ "selection": { "directReference": { "structField": { "field": 0 } }, "rootReference": { } } }] } }, "names": ["A"] } }], "expectedTypeUrls": [] } ``` </details> -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
