ftsrg / ingraph

Incremental view maintenance for openCypher graph queries.
http://docs.inf.mit.bme.hu/ingraph/
Eclipse Public License 1.0
48 stars 10 forks source link

Bad plan for UNWIND and MATCH #380

Open szarnyasg opened 5 years ago

szarnyasg commented 5 years ago

To reproduce the issue, add the following to one of the compiler tests, e.g. RandomCompilationTest:

  test("Indexing array in MATCH") {
    val stages = compile(
      """UNWIND [[20, 30]] AS tuple
        |MATCH (org:Organisation {id: tuple[0]})
        |RETURN org.id
      """.stripMargin)
    printlnSuppressIfIngraph(stages.toString)
  }

This results in:

'Production
+- 'Projection [ret(p(id, v(org, {}, false, (org#0)), (org.id#0)), (org.id), (org.id#1))]
   +- 'Join
      :- 'Unwind unwindattribute(listexpression(listexpression(20, 30)), tuple, (tuple#0))
      :  +- Dual
      +- 'AllDifferent
         +- 'Selection (p(id, v(org, {}, false, (org#0)), (org.id#0)) = indexlookupexpression(unwindattribute(listexpression(listexpression(20, 30)), tuple, (tuple#0)), 0))
            +- 'GetVertices v(org, {Organisation}, (id,indexlookupexpression(unwindattribute(listexpression(listexpression(20, 30)), tuple, (tuple#0)), 0)), false, (org#0))

This plan does not work because the Selection operator is trying to filter for tuple#0, which is produced on the other branch of the Join operator (by the Unwind operator).

This currently blocks Interactive update 1.