From 5000f5c13335a97bd4c47803d1c45d1e83473292 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Jan 2013 11:43:57 +0530 Subject: [PATCH] User category searching --- src/calibre/db/search.py | 27 +++++++++++++++++++++++++++ src/calibre/db/tests/metadata.db | Bin 235520 -> 236544 bytes src/calibre/db/tests/reading.py | 1 + 3 files changed, 28 insertions(+) diff --git a/src/calibre/db/search.py b/src/calibre/db/search.py index 5a02a5e5da..334bc046d8 100644 --- a/src/calibre/db/search.py +++ b/src/calibre/db/search.py @@ -525,8 +525,35 @@ class Parser(SearchQueryParser): candidates, upf) return self.keypair_search(query, field_iter, candidates, upf) + # check for user categories + if len(location) >= 2 and location.startswith('@'): + return self.get_user_category_matches(location[1:], icu_lower(query), candidates) + return matches + def get_user_category_matches(self, location, query, candidates): + matches = set() + if len(query) < 2: + return matches + + user_cats = self.dbcache.pref('user_categories') + c = set(candidates) + + if query.startswith('.'): + check_subcats = True + query = query[1:] + else: + check_subcats = False + + for key in user_cats: + if key == location or (check_subcats and key.startswith(location + '.')): + for (item, category, ign) in user_cats[key]: + s = self.get_matches(category, '=' + item, candidates=c) + c -= s + matches |= s + if query == 'false': + return candidates - matches + return matches class Search(object): diff --git a/src/calibre/db/tests/metadata.db b/src/calibre/db/tests/metadata.db index 4bd6dfe4f97d037ed7c343a87e6cc929d153b5d9..94748877b6203bb38b302551f2c80ff863b6059e 100644 GIT binary patch delta 1976 zcmeHIUu;ul6u-Bp9WuJDRkx0@;cb^dn2K$jm`vR|-K=4bF0zqoZAxixy4rE?ynig) z7;Ym<2$HbWaN+|JeZU|-fFxdw#t}5BF~bz_?@+eHz%qI9$robcxnG;vE+g^P#H8n@ z_x#TNo!|Yw@BHq>+3JZ4)yFp2bdKW|r-cq)KezkLOw}UX;ZAU$aMvv=_gmI!f4s4Q zw{pJPJ+eHcMq`Q?)s&Q~#WYbNro;!MnyBnm$HrYT zEBA;~5;JO4lcRgYs5&CW#Y8yLELpjLGkYZ06c0xZ)~Yt{!8dDkRaByJqE5<6N>s-x z1;G=L<%FOz96w^w&fmKD25+O?{Z;$;s|46|Hw5_X?TbykmOYen^HTP7u7g((F69m_ z<#=N$XKB#*8|dtT&35*VMOiqUf{p0i0rw+DpgNnsWXB5wP`}Y%TJ_Ird;Cdr&#*lR zb+{!2^_Y1E4x_ObHW@8X!YdXlY0Bel09x_nc35ZB_+b#7WturAIf|RH5zqf)UuHi4rLjNE+iuY= z&g0A!Y&Je?hi)F{CZHPcq~Kw8PLa;3`-8Xl0UO4J?DVM1I5P?ZykXrB$5`?vI(s2y z{B;0;$D_O8J{tT1^!C6#_~$Ng;5Q+f=MOb#<{Jv5TQKRebt;+R`n%0A_Vq%GgIP%l z1NvVB7v}fFhEo&ZI8JSt=d|CY)w0zW&8Oh#TbU6t3oiIBx!wTOwS&A-Pz1#{6P{U;()LuEXfA_GmMLVJ{ZCn!zWvxJd?6*P!zv(LeayxjhOmZw`%FTvGC^CdQ27O*n*w+#2>hXn#hGl0e zPpfEu_@|$Ep$%Bkz~rIFX03m+fc4EnhnV`~4Bs$;Nl*IwKLY3fj}4quV!5*qkvJ7OS@ z8|6A>__{wxu|0}c(18SCDYQ_$0Y=(kNA5-if8&n^`aNZ(B-v5Pqm38`l_s!>wm49r zy1u142TI5p#7=&p86nW`CS=pB0~Qs2N0J*gJnB+~@fzq@1s!n0O2y64tAzJ-trgWg z+=la@O8?rbA9z(eo`Mz=%BlJ`6i;4;MrD7b`eqdJ!(LnmolN18E+9FwxpqeZ$v`h{{ zloKcNxbYZTRv)~;2aY2y(!3kJJa7_VlM*)PW{MNSIwdvuj(JS~3y~6`=l?T8ri@Hw vU&f3AGd?ir4J;#e#vD-7c`l!~CUHa5Mk77J5Is5sGfg?6qhkNsx4-@c!Lsl4 diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index 2fa49033c0..627a692860 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -220,6 +220,7 @@ class ReadingTest(BaseTest): # TODO: Tests for searching the size column and # cover:true|false + # TODO: Tests for user categories searching )} old = None