From 879f6baa09a06c5671ce233336e91baea47e9046 Mon Sep 17 00:00:00 2001 From: Thibault Ehrhart Date: Tue, 27 Aug 2024 21:19:05 +0200 Subject: [PATCH] fix: correct naming of aggregated results when using variables Using aggregates with a variable (e.g., `{ v: "?v$sum" }`) would incorrectly generate SPARQL queries like "(SUM(?v) AS ?v)", leading to invalid queries in stricter engines like GraphDB. The naming convention is now adjusted to generate unique variable names, such as "(SUM(?v) AS ?v_sum)". This was already the case when using expressions such as "$schema:value$sum", but it didn't apply to variables. This commit fixes that behavior. --- examples/json_queries/aggregates.json | 6 ++++-- examples/json_transformed/aggregates.json | 3 ++- examples/sparql_output/aggregates.json | 7 ++++++- examples/sparql_queries/aggregates.rq | 5 +++-- src/main.mjs | 2 +- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/examples/json_queries/aggregates.json b/examples/json_queries/aggregates.json index 7eb2119..335ea14 100644 --- a/examples/json_queries/aggregates.json +++ b/examples/json_queries/aggregates.json @@ -4,9 +4,11 @@ "sum": "?v$sum", "min": "?v$min", "max": "?v$max", - "avg": "?v$avg$var:average" + "avg": "?v$avg$var:average", + "value_sum": "?value$sum" }, "$where": [ - "VALUES (?v) { (10.5) (20.5) }" + "VALUES (?v) { (10.5) (20.5) }", + "?id schema:value ?value" ] } diff --git a/examples/json_transformed/aggregates.json b/examples/json_transformed/aggregates.json index 0653bd5..929261d 100644 --- a/examples/json_transformed/aggregates.json +++ b/examples/json_transformed/aggregates.json @@ -4,6 +4,7 @@ "count": 2, "max": 20.5, "min": 10.5, - "sum": 31 + "sum": 31, + "value_sum": 42 } ] \ No newline at end of file diff --git a/examples/sparql_output/aggregates.json b/examples/sparql_output/aggregates.json index 8a5b06a..f777776 100644 --- a/examples/sparql_output/aggregates.json +++ b/examples/sparql_output/aggregates.json @@ -1,7 +1,7 @@ { "head": { "link": [], - "vars": ["total", "sum_v", "min_v", "max_v", "average"] + "vars": ["total", "sum_v", "min_v", "max_v", "average", "sum_value"] }, "results": { "distinct": false, @@ -31,6 +31,11 @@ "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#decimal", "value": "15.5" + }, + "sum_value": { + "type": "typed-literal", + "datatype": "http://www.w3.org/2001/XMLSchema#decimal", + "value": "42" } }] } diff --git a/examples/sparql_queries/aggregates.rq b/examples/sparql_queries/aggregates.rq index ee22a2e..713453e 100644 --- a/examples/sparql_queries/aggregates.rq +++ b/examples/sparql_queries/aggregates.rq @@ -1,4 +1,5 @@ - SELECT DISTINCT (COUNT(DISTINCT ?v) AS ?total) (SUM(?v) AS ?sum_v) (MIN(?v) AS ?min_v) (MAX(?v) AS ?max_v) (AVG(?v) AS ?average) + SELECT DISTINCT (COUNT(DISTINCT ?v) AS ?total) (SUM(?v) AS ?sum_v) (MIN(?v) AS ?min_v) (MAX(?v) AS ?max_v) (AVG(?v) AS ?average) (SUM(?value) AS ?sum_value) WHERE { - VALUES (?v) { (10.5) (20.5) } + VALUES (?v) { (10.5) (20.5) }. + ?id schema:value ?value } diff --git a/src/main.mjs b/src/main.mjs index 08a0fe4..b2f6412 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -326,7 +326,7 @@ function manageProtoKey(proto, vars = [], filters = [], wheres = [], const aggrWhat = is$ ? id : originalId; if (aggregate && !givenVar) { - id = is$ ? originalId : `?${aggregate}_${originalId.replace('?', '')}`; + id = `?${aggregate}_${aggrWhat.replace('?', '')}`; } // assign a clean id to the prototype