-
Notifications
You must be signed in to change notification settings - Fork 159
Open
Labels
Description
Describe the bug
When defining filters via the @authorization directive, these filters are not rendered as WHERE clauses inside subqueries which match/reference on the (root)-node for which these filters are defined.
Type definitions
type Product @mutation(operations: []) @authorization(filter: [{requireAuthentication: false, operations: [READ,AGGREGATE], where: {AND: [{node:{isPublic:true}}, {node:{isEmpty:false}}] }}]) @subscription(events: []) {
"""Unique Identifier of this product"""
productId: Int! @unique
isEmpty: Boolean! @default(value: false)
isPublic: Boolean! @default(value: false)
"""The product variants belonging to this product"""
variants: [Product!]! @relationship (type: "PRODUCT_HAS_FAMILY_PRODUCT", direction: IN, nestedOperations: [], queryDirection: DEFAULT_DIRECTED) @settable(onCreate: false, onUpdate: false)
}To Reproduce
Steps to reproduce the behavior:
- Run a server with the type definitions and DEBUG enabled
- Execute the following Query:
query{
products(options:{limit:1} where:{variantsAggregate:{count:1}}){
productId
variantsAggregate{
count
}
}
}- See the generated cypher-query:
MATCH (this:Product)
CALL {
WITH this
MATCH (this)<-[this0:PRODUCT_HAS_FAMILY_PRODUCT]-(this1:Product)
RETURN count(this1) = $param0 AS var2
}
WITH *
WHERE (var2 = true AND (($param1 IS NOT NULL AND this.isEmpty = $param1) AND ($param2 IS NOT NULL AND this.isPublic = $param2)))
WITH *
LIMIT $param3
CALL {
WITH this
MATCH (this)<-[this3:PRODUCT_HAS_FAMILY_PRODUCT]-(this4:Product)
WHERE (($param4 IS NOT NULL AND this4.isEmpty = $param4) AND ($param5 IS NOT NULL AND this4.isPublic = $param5))
RETURN count(this4) AS var5
}
RETURN this { .productId, variantsAggregate: { count: var5 } } AS this
cypher params: {
param0: Integer { low: 1, high: 0 },
param1: false,
param2: true,
param3: Integer { low: 1, high: 0 },
param4: false,
param5: true
}
The generated query misses the authorization filters inside the subquery on the referenced Product node. The query should look like this (see 4th line):
MATCH (this:Product)
CALL {
WITH this
MATCH (this)<-[this0:PRODUCT_HAS_FAMILY_PRODUCT]-(this1:Product) WHERE (($param1 IS NOT NULL AND this.isEmpty = $param1) AND ($param2 IS NOT NULL AND this.isPublic = $param2))
RETURN count(this1) = $param0 AS var2
}
WITH *
WHERE (var2 = true AND (($param1 IS NOT NULL AND this.isEmpty = $param1) AND ($param2 IS NOT NULL AND this.isPublic = $param2)))
WITH *
LIMIT $param3
CALL {
WITH this
MATCH (this)<-[this3:PRODUCT_HAS_FAMILY_PRODUCT]-(this4:Product)
WHERE (($param4 IS NOT NULL AND this4.isEmpty = $param4) AND ($param5 IS NOT NULL AND this4.isPublic = $param5))
RETURN count(this4) AS var5
}
RETURN this { .productId, variantsAggregate: { count: var5 } } AS this
cypher params: {
param0: Integer { low: 1, high: 0 },
param1: false,
param2: true,
param3: Integer { low: 1, high: 0 },
param4: false,
param5: true
}Expected behavior
Authorization filters from the @authorization directive should be generated as WHERE clauses on all subqueries/queries which match on a node for which these filters are defined.
System
- Version: @neo4j/[email protected]