def get_matches(self, location, query): location = location.lower().strip() if location == 'authors': location = 'author' elif location == 'formats': location = 'format' matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith('\\'): query = query[1:] elif query.startswith('='): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith('~'): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(['all']) locations = all_locs if location == 'all' else [location] q = { 'author': lambda x: x.author.lower(), 'format': attrgetter('formats'), 'title': lambda x: x.title.lower(), } for x in ('author', 'format'): q[x + 's'] = q[x] for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == 'true': if accessor(sr) is not None: matches.add(sr) continue if query == 'false': if accessor(sr) is None: matches.add(sr) continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == 'author' and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches
def get_matches(self, location, query): location = location.lower().strip() if location == "authors": location = "author" elif location == "formats": location = "format" matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith("\\"): query = query[1:] elif query.startswith("="): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith("~"): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(["all"]) locations = all_locs if location == "all" else [location] q = {"author": lambda x: x.author.lower(), "format": attrgetter("formats"), "title": lambda x: x.title.lower()} for x in ("author", "format"): q[x + "s"] = q[x] for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == "true": if accessor(sr) is not None: matches.add(sr) continue if query == "false": if accessor(sr) is None: matches.add(sr) continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == "author" and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches
def get_matches(self, location, query): location = location.lower().strip() if location == 'formats': location = 'format' matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith('\\'): query = query[1:] elif query.startswith('='): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith('~'): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(['all']) locations = all_locs if location == 'all' else [location] q = { 'affiliate': lambda x: x.affiliate, 'description': lambda x: x.description.lower(), 'drm': lambda x: not x.drm_free_only, 'enabled': lambda x: not is_disabled(x), 'format': lambda x: ','.join(x.formats).lower(), 'headquarters': lambda x: x.headquarters.lower(), 'name': lambda x : x.name.lower(), } q['formats'] = q['format'] for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == 'true': if locvalue in ('affiliate', 'drm', 'enabled'): if accessor(sr) == True: matches.add(sr) elif accessor(sr) is not None: matches.add(sr) continue if query == 'false': if locvalue in ('affiliate', 'drm', 'enabled'): if accessor(sr) == False: matches.add(sr) elif accessor(sr) is None: matches.add(sr) continue # this is bool, so can't match below if locvalue in ('affiliate', 'drm', 'enabled'): continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == 'name' and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind if locvalue == 'format': vals = accessor(sr).split(',') else: vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches
def get_matches(self, location, query): query = query.strip() location = location.lower().strip() if location == 'authors': location = 'author' elif location == 'downloads': location = 'download' elif location == 'formats': location = 'format' matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith('\\'): query = query[1:] elif query.startswith('='): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith('~'): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(['all']) locations = all_locs if location == 'all' else [location] q = { 'affiliate': attrgetter('affiliate'), 'author': lambda x: x.author.lower(), 'cover': attrgetter('cover_url'), 'drm': attrgetter('drm'), 'download': attrgetter('downloads'), 'format': attrgetter('formats'), 'price': lambda x: comparable_price(x.price), 'store': lambda x: x.store_name.lower(), 'title': lambda x: x.title.lower(), } for x in ('author', 'download', 'format'): q[x+'s'] = q[x] # make the price in query the same format as result if location == 'price': query = comparable_price(query) for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == 'true': # True/False. if locvalue == 'affiliate': if accessor(sr): matches.add(sr) # Special that are treated as True/False. elif locvalue == 'drm': if accessor(sr) == SearchResult.DRM_LOCKED: matches.add(sr) # Testing for something or nothing. else: if accessor(sr) is not None: matches.add(sr) continue if query == 'false': # True/False. if locvalue == 'affiliate': if not accessor(sr): matches.add(sr) # Special that are treated as True/False. elif locvalue == 'drm': if accessor(sr) == SearchResult.DRM_UNLOCKED: matches.add(sr) # Testing for something or nothing. else: if accessor(sr) is None: matches.add(sr) continue # this is bool or treated as bool, so can't match below. if locvalue in ('affiliate', 'drm', 'download', 'downloads'): continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == 'author' and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind if locvalue == 'format': vals = accessor(sr).split(',') else: vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches
def get_matches(self, location, query): location = location.lower().strip() if location == 'formats': location = 'format' matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith('\\'): query = query[1:] elif query.startswith('='): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith('~'): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(['all']) locations = all_locs if location == 'all' else [location] q = { 'affiliate': lambda x: x.affiliate, 'description': lambda x: x.description.lower(), 'drm': lambda x: not x.drm_free_only, 'enabled': lambda x: not is_disabled(x), 'format': lambda x: ','.join(x.formats).lower(), 'headquarters': lambda x: x.headquarters.lower(), 'name': lambda x: x.name.lower(), } q['formats'] = q['format'] for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == 'true': if locvalue in ('affiliate', 'drm', 'enabled'): if accessor(sr) == True: matches.add(sr) elif accessor(sr) is not None: matches.add(sr) continue if query == 'false': if locvalue in ('affiliate', 'drm', 'enabled'): if accessor(sr) == False: matches.add(sr) elif accessor(sr) is None: matches.add(sr) continue # this is bool, so can't match below if locvalue in ('affiliate', 'drm', 'enabled'): continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == 'name' and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind if locvalue == 'format': vals = accessor(sr).split(',') else: vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches
def get_matches(self, location, query): query = query.strip() location = location.lower().strip() if location == 'authors': location = 'author' elif location == 'downloads': location = 'download' elif location == 'formats': location = 'format' matchkind = CONTAINS_MATCH if len(query) > 1: if query.startswith('\\'): query = query[1:] elif query.startswith('='): matchkind = EQUALS_MATCH query = query[1:] elif query.startswith('~'): matchkind = REGEXP_MATCH query = query[1:] if matchkind != REGEXP_MATCH: ### leave case in regexps because it can be significant e.g. \S \W \D query = query.lower() if location not in self.USABLE_LOCATIONS: return set([]) matches = set([]) all_locs = set(self.USABLE_LOCATIONS) - set(['all']) locations = all_locs if location == 'all' else [location] q = { 'affiliate': attrgetter('affiliate'), 'author': lambda x: x.author.lower(), 'cover': attrgetter('cover_url'), 'drm': attrgetter('drm'), 'download': attrgetter('downloads'), 'format': attrgetter('formats'), 'price': lambda x: comparable_price(x.price), 'store': lambda x: x.store_name.lower(), 'title': lambda x: x.title.lower(), } for x in ('author', 'download', 'format'): q[x + 's'] = q[x] # make the price in query the same format as result if location == 'price': query = comparable_price(query) for sr in self.srs: for locvalue in locations: accessor = q[locvalue] if query == 'true': # True/False. if locvalue == 'affiliate': if accessor(sr): matches.add(sr) # Special that are treated as True/False. elif locvalue == 'drm': if accessor(sr) == SearchResult.DRM_LOCKED: matches.add(sr) # Testing for something or nothing. else: if accessor(sr) is not None: matches.add(sr) continue if query == 'false': # True/False. if locvalue == 'affiliate': if not accessor(sr): matches.add(sr) # Special that are treated as True/False. elif locvalue == 'drm': if accessor(sr) == SearchResult.DRM_UNLOCKED: matches.add(sr) # Testing for something or nothing. else: if accessor(sr) is None: matches.add(sr) continue # this is bool or treated as bool, so can't match below. if locvalue in ('affiliate', 'drm', 'download', 'downloads'): continue try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author ### exactmatch searches into contains searches. if locvalue == 'author' and matchkind == EQUALS_MATCH: m = CONTAINS_MATCH else: m = matchkind if locvalue == 'format': vals = accessor(sr).split(',') else: vals = [accessor(sr)] if _match(query, vals, m): matches.add(sr) break except ValueError: # Unicode errors import traceback traceback.print_exc() return matches