Skip to content

Commit 35a34e3

Browse files
Merge pull request #997 from SuffolkLITLab/888-unique-session-results
Use subquery on session search so we can do SELECT DISTINCT correctly
2 parents 12cd9bb + 2c3e043 commit 35a34e3

File tree

1 file changed

+60
-54
lines changed

1 file changed

+60
-54
lines changed

docassemble/AssemblyLine/sessions.py

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -379,38 +379,39 @@ def get_saved_interview_list(
379379
filenames_to_exclude.extend([current_filename, filename_to_exclude])
380380

381381
query_draft = """
382-
SELECT DISTINCT ON (userdict.key) userdict.indexno
383-
,userdict.filename as filename
384-
,num_keys
385-
,userdictkeys.user_id as user_id
386-
,userdict.modtime as modtime
387-
,userdict.key as key
388-
,jsonstorage.data->'auto_title' as auto_title
389-
,jsonstorage.data->'title' as title
390-
,jsonstorage.data->'description' as description
391-
,jsonstorage.data->'steps' as steps
392-
,jsonstorage.data->'progress' as progress
393-
,jsonstorage.data->'original_interview_filename' as original_interview_filename
394-
,jsonstorage.data->'answer_count' as answer_count
395-
,jsonstorage.data as data
396-
FROM userdict
397-
NATURAL JOIN
398-
(
399-
SELECT key
400-
,MAX(modtime) AS modtime
401-
,COUNT(key) AS num_keys
402-
FROM userdict
403-
GROUP BY key
404-
) mostrecent
405-
LEFT JOIN userdictkeys
406-
ON userdictkeys.key = userdict.key
407-
LEFT JOIN jsonstorage
408-
ON userdict.key = jsonstorage.key AND (jsonstorage.tags = :metadata)
409-
WHERE (userdictkeys.user_id = :user_id or :user_id is null)
410-
AND (userdict.filename = :filename OR :filename is null)
411-
AND (userdict.filename NOT IN :filenames_to_exclude)
412-
AND (NOT :exclude_newly_started_sessions OR num_keys > 1)
413-
"""
382+
SELECT * FROM (
383+
SELECT DISTINCT ON (userdict.key) userdict.indexno
384+
,userdict.filename as filename
385+
,num_keys
386+
,userdictkeys.user_id as user_id
387+
,userdict.modtime as modtime
388+
,userdict.key as key
389+
,jsonstorage.data->'auto_title' as auto_title
390+
,jsonstorage.data->'title' as title
391+
,jsonstorage.data->'description' as description
392+
,jsonstorage.data->'steps' as steps
393+
,jsonstorage.data->'progress' as progress
394+
,jsonstorage.data->'original_interview_filename' as original_interview_filename
395+
,jsonstorage.data->'answer_count' as answer_count
396+
,jsonstorage.data as data
397+
FROM userdict
398+
NATURAL JOIN
399+
(
400+
SELECT key
401+
,MAX(modtime) AS modtime
402+
,COUNT(key) AS num_keys
403+
FROM userdict
404+
GROUP BY key
405+
) mostrecent
406+
LEFT JOIN userdictkeys
407+
ON userdictkeys.key = userdict.key
408+
LEFT JOIN jsonstorage
409+
ON userdict.key = jsonstorage.key AND (jsonstorage.tags = :metadata)
410+
WHERE (userdictkeys.user_id = :user_id or :user_id is null)
411+
AND (userdict.filename = :filename OR :filename is null)
412+
AND (userdict.filename NOT IN :filenames_to_exclude)
413+
AND (NOT :exclude_newly_started_sessions OR num_keys > 1)
414+
"""
414415
if packages_to_exclude:
415416
query_draft += (
416417
"""
@@ -424,7 +425,9 @@ def get_saved_interview_list(
424425
"""
425426
)
426427
query_draft += """
427-
ORDER BY modtime desc
428+
ORDER BY userdict.key, modtime DESC
429+
) AS unique_sessions
430+
ORDER BY modtime DESC
428431
LIMIT :limit
429432
OFFSET :offset;
430433
"""
@@ -589,27 +592,30 @@ def find_matching_sessions(
589592

590593
get_sessions_query = text(
591594
f"""
592-
SELECT DISTINCT ON (userdict.key) userdict.indexno,
593-
userdict.filename as filename,
594-
num_keys,
595-
userdictkeys.user_id as user_id,
596-
userdict.modtime as modtime,
597-
userdict.key as key,
598-
{', '.join(f"jsonstorage.data->>{repr(column)} as {column}" for column in metadata_column_names)},
599-
jsonstorage.data as data
600-
FROM userdict
601-
NATURAL JOIN (
602-
SELECT key, MAX(modtime) AS modtime, COUNT(key) AS num_keys
603-
FROM userdict
604-
GROUP BY key
605-
) mostrecent
606-
LEFT JOIN userdictkeys ON userdictkeys.key = userdict.key
607-
LEFT JOIN jsonstorage ON userdict.key = jsonstorage.key AND (jsonstorage.tags = :metadata)
608-
WHERE (userdictkeys.user_id = :user_id OR :user_id is NULL)
609-
AND {filename_condition}
610-
AND (userdict.filename NOT IN :filenames_to_exclude)
611-
AND (NOT :exclude_newly_started_sessions OR num_keys > 1)
612-
AND ({metadata_search_conditions})
595+
SELECT * FROM (
596+
SELECT DISTINCT ON (userdict.key) userdict.indexno,
597+
userdict.filename as filename,
598+
num_keys,
599+
userdictkeys.user_id as user_id,
600+
userdict.modtime as modtime,
601+
userdict.key as key,
602+
{', '.join(f"jsonstorage.data->>{repr(column)} as {column}" for column in metadata_column_names)},
603+
jsonstorage.data as data
604+
FROM userdict
605+
NATURAL JOIN (
606+
SELECT key, MAX(modtime) AS modtime, COUNT(key) AS num_keys
607+
FROM userdict
608+
GROUP BY key
609+
) mostrecent
610+
LEFT JOIN userdictkeys ON userdictkeys.key = userdict.key
611+
LEFT JOIN jsonstorage ON userdict.key = jsonstorage.key AND (jsonstorage.tags = :metadata)
612+
WHERE (userdictkeys.user_id = :user_id OR :user_id is NULL)
613+
AND {filename_condition}
614+
AND (userdict.filename NOT IN :filenames_to_exclude)
615+
AND (NOT :exclude_newly_started_sessions OR num_keys > 1)
616+
AND ({metadata_search_conditions})
617+
ORDER BY userdict.key, modtime DESC
618+
) AS unique_sessions
613619
ORDER BY modtime DESC
614620
LIMIT :limit OFFSET :offset;
615621
"""

0 commit comments

Comments
 (0)