Aklakan commented on code in PR #2925: URL: https://github.com/apache/jena/pull/2925#discussion_r1916869473
########## jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterLateral.java: ########## @@ -292,17 +295,33 @@ public Op transform(OpTable opTable) { // By the assignment restriction, the binding only needs to be added to each row of the table. Table table = opTable.getTable(); // Table vars. - List<Var> vars = new ArrayList<>(table.getVars()); - binding.vars().forEachRemaining(vars::add); - TableN table2 = new TableN(vars); + List<Var> tableVars = table.getVars(); + List<Var> vars = new ArrayList<>(tableVars); + + // Track variables that appear both in the table and the binding. + List<Var> commonVars = new ArrayList<>(); + + // Index variables in a set if there are more than a few of them. + Collection<Var> tableVarsIndex = tableVars.size() > 4 ? new HashSet<>(tableVars) : tableVars; + binding.vars().forEachRemaining(v -> { + if (tableVarsIndex.contains(v)) { + commonVars.add(v); + } else { + vars.add(v); + } + }); + + List<Binding> bindings = new ArrayList<>(table.size()); BindingBuilder builder = BindingFactory.builder(); table.iterator(null).forEachRemaining(row->{ - builder.reset(); - builder.addAll(row); - builder.addAll(binding); - table2.addBinding(builder.build()); + if (Algebra.compatible(row, binding, commonVars.iterator())) { Review Comment: There is potentially another can of worms I was about to open w.r.t. sep7: Perhaps its worthy of opening an issue and discussion on sparql-dev. The reason I added the compatibility check was because I had the following query in mind, which for reasons I do not yet understand is currently prohibited: ```sparql SELECT * { VALUES ?department { <urn:dept1> <urn:dept2> } LATERAL { SELECT * { VALUES (?department ?employee) { ( <urn:dept1> <urn:person1> ) ( <urn:dept1> <urn:person2> ) ( <urn:dept2> <urn:person1> ) } } ORDER BY ?employee LIMIT 1 } } ``` | department | employee | |--------------------|---------| | <urn:dept1> | <urn:person1> | | <urn:dept2> | <urn:person1> | ------------------------------- So when creating the PR I was surprised to find out that this query is already considered illegal. Removing the restrictions `SyntaxVarScope.checkLATERAL` on `Element_Bind` and `Element_Data`) and adding the check for compatible bindings (as done in the PR) naturally makes the query work. -- 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: pr-unsubscr...@jena.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscr...@jena.apache.org For additional commands, e-mail: pr-h...@jena.apache.org