diff options
| author | 2021-07-27 13:19:21 -0400 | |
|---|---|---|
| committer | 2021-07-27 13:19:21 -0400 | |
| commit | 244bb8ed4b358262287fe806666fb089513cad81 (patch) | |
| tree | 7decf8be191723da68f95e79d9dcef73f634379c | |
| parent | add command line option for search (diff) | |
queryparse: fix NOT
NOT queries are now two-step: the list is queries and then all elements
in the cards table that are also in the query are discarded.
| -rw-r--r-- | queryparse.py | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/queryparse.py b/queryparse.py index 7ebd0ab..b1acddb 100644 --- a/queryparse.py +++ b/queryparse.py @@ -55,22 +55,23 @@ class ParseTree: def query_lit(alist, lit, isNot): id = len(alist) + 1 if lit.op == LitType.TAGGLOB: - qr = f"""tag in (SELECT DISTINCT id FROM tags + qr = f"""SELECT DISTINCT card FROM tagmap WHERE + tag in (SELECT DISTINCT id FROM tags WHERE name GLOB ?{id})""" elif lit.op == LitType.TITLEGLOB: - qr = f"""card in (SELECT DISTINCT id FROM cards - WHERE name GLOB ?{id})""" + qr = f"SELECT id FROM cards WHERE name GLOB ?{id})" elif lit.op == LitType.TAG: - qr = f"""tag in (SELECT id FROM tags + qr = f"""SELECT DISTINCT card FROM tagmap WHERE + tag in (SELECT id FROM tags WHERE name = ?{id} LIMIT 1)""" else: raise ParseError alist.append(lit.v) - if isNot: - qr = f"NOT ({qr})" - return f"SELECT DISTINCT card FROM tagmap WHERE {qr}" + qr = f"SELECT id AS card FROM cards WHERE id NOT IN ({qr})" + return qr + # Returns bl,xpr where bl = True when xpr is for a literal def build_r(alist, pt): |
