Skip to content

Commit 05a8640

Browse files
committed
feat: support group_concat in sqlite
1 parent 9d6eb3f commit 05a8640

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

pegjs/sqlite.pegjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2427,7 +2427,7 @@ over_partition
24272427
}
24282428
/ on_update_current_timestamp
24292429
aggr_fun_count
2430-
= name:KW_COUNT __ LPAREN __ arg:count_arg __ RPAREN __ bc:over_partition? {
2430+
= name:(KW_COUNT / KW_GROUP_CONCAT) __ LPAREN __ arg:count_arg __ RPAREN __ bc:over_partition? {
24312431
return {
24322432
type: 'aggr_func',
24332433
name: name,
@@ -2805,6 +2805,7 @@ KW_AND = "AND"i !ident_start { return 'AND'; }
28052805
KW_OR = "OR"i !ident_start { return 'OR'; }
28062806

28072807
KW_COUNT = "COUNT"i !ident_start { return 'COUNT'; }
2808+
KW_GROUP_CONCAT = "GROUP_CONCAT"i !ident_start { return 'GROUP_CONCAT'; }
28082809
KW_MAX = "MAX"i !ident_start { return 'MAX'; }
28092810
KW_MIN = "MIN"i !ident_start { return 'MIN'; }
28102811
KW_SUM = "SUM"i !ident_start { return 'SUM'; }

test/sqlite.spec.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,20 @@ describe('sqlite', () => {
269269
const sql = `SELECT * FROM table_name WHERE column_name LIKE '%pattern%' ESCAPE '\'`
270270
expect(getParsedSql(sql)).to.be.equal(`SELECT * FROM "table_name" WHERE "column_name" LIKE '%pattern%' ESCAPE '\'`)
271271
})
272+
it('should support GROUP_CONCAT', () => {
273+
const sql = `SELECT
274+
CASE
275+
WHEN rs.url LIKE 'http://%' THEN SUBSTR(rs.url, 8, INSTR(SUBSTR(rs.url, 8), '/') - 1)
276+
WHEN rs.url LIKE 'https://%' THEN SUBSTR(rs.url, 9, INSTR(SUBSTR(rs.url, 9), '/') - 1)
277+
ELSE SUBSTR(rs.url, 1, INSTR(rs.url, '/') - 1)
278+
END AS domain,
279+
COUNT(*) AS total_citations,
280+
COUNT(DISTINCT mr.model_id) AS models_citing,
281+
COUNT(DISTINCT mr.response_id) AS responses_citing,
282+
GROUP_CONCAT(DISTINCT m.model_name) AS citing_models,
283+
AVG(mr.brand_visibility_score) AS avg_visibility_score,
284+
AVG(mr.recommendation_quality_score) AS avg_recommendation_quality
285+
FROM response_sources rs`
286+
expect(getParsedSql(sql)).to.be.equal(`SELECT CASE WHEN "rs"."url" LIKE 'http://%' THEN SUBSTR("rs"."url", 8, INSTR(SUBSTR("rs"."url", 8), '/') - 1) WHEN "rs"."url" LIKE 'https://%' THEN SUBSTR("rs"."url", 9, INSTR(SUBSTR("rs"."url", 9), '/') - 1) ELSE SUBSTR("rs"."url", 1, INSTR("rs"."url", '/') - 1) END AS "domain", COUNT(*) AS "total_citations", COUNT(DISTINCT "mr"."model_id") AS "models_citing", COUNT(DISTINCT "mr"."response_id") AS "responses_citing", GROUP_CONCAT(DISTINCT "m"."model_name") AS "citing_models", AVG("mr"."brand_visibility_score") AS "avg_visibility_score", AVG("mr"."recommendation_quality_score") AS "avg_recommendation_quality" FROM "response_sources" AS "rs"`)
287+
})
272288
})

0 commit comments

Comments
 (0)