aboutsummaryrefslogtreecommitdiffstats
path: root/queryparse.py
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2021-07-27 13:19:21 -0400
committerGravatar Peter McGoron 2021-07-27 13:19:21 -0400
commit244bb8ed4b358262287fe806666fb089513cad81 (patch)
tree7decf8be191723da68f95e79d9dcef73f634379c /queryparse.py
parentadd 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.
Diffstat (limited to 'queryparse.py')
-rw-r--r--queryparse.py15
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):