def test_base_query_legalities() -> None: sql = multiverse.base_query("f.name = 'Mother of Runes'") rs = db().execute(sql) assert len(rs) == 1 legalities = rs[0]['legalities'] assert 'Penny Dreadful EMN:Legal' in legalities assert 'Penny Dreadful AKH:Legal' not in legalities
def test_base_query_legalities() -> None: sql = multiverse.base_query("f.name = 'Mother of Runes'") db().execute('SET group_concat_max_len=100000') rs = db().select(sql) assert len(rs) == 1 legalities = rs[0]['legalities'] assert 'Penny Dreadful EMN:Legal' in legalities assert 'Penny Dreadful AKH:Legal' not in legalities
def search(query): like_query = '%{query}%'.format(query=card.canonicalize(query)) sql = """ {base_query} HAVING name_ascii LIKE %s OR names LIKE %s ORDER BY pd_legal DESC, name """.format(base_query=multiverse.base_query()) rs = db().execute(sql, [like_query, like_query]) return [card.Card(r) for r in rs]
def legal_cards(force=False): if len(LEGAL_CARDS) == 0 or force: new_list = multiverse.set_legal_cards(force) if new_list is None: sql = 'SELECT bq.name FROM ({base_query}) AS bq WHERE bq.id IN (SELECT card_id FROM card_legality WHERE format_id = {format_id})'.format( base_query=multiverse.base_query(), format_id=multiverse.get_format_id('Penny Dreadful')) new_list = [row['name'] for row in db().execute(sql)] LEGAL_CARDS.clear() for name in new_list: LEGAL_CARDS.append(name) return LEGAL_CARDS
def name_lookup(name): if name == 'Kongming, Sleeping Dragon': name = 'Kongming, "Sleeping Dragon"' elif name == 'Pang Tong, Young Phoenix': name = 'Pang Tong, "Young Phoenix"' if not CARDS: rs = db().execute(multiverse.base_query()) for row in rs: CARDS[card.canonicalize(row['name'])] = row['name'] canonical = card.canonicalize(name) if canonical not in CARDS: raise InvalidDataException("Bogus name {name} ({canonical}) found.".format(name=name, canonical=canonical)) return CARDS[canonical]
def load_cards(names=None): if names: names = set(names) if names: names_clause = 'HAVING LOWER({name_query}) IN ({names})'.format(name_query=card.name_query().format(table='u'), names=', '.join(sqlescape(name).lower() for name in names)) else: names_clause = '' sql = """ {base_query} {names_clause} """.format(base_query=base_query(), names_clause=names_clause) rs = db().execute(sql) if names and len(names) != len(rs): missing = names.symmetric_difference([r['name'] for r in rs]) raise TooFewItemsException('Expected `{namelen}` and got `{rslen}` with `{names}`. missing=`{missing}`'.format(namelen=len(names), rslen=len(rs), names=names, missing=missing)) return [card.Card(r) for r in rs]
def search(query, fuzzy_threshold=260): query = card.canonicalize(query) like_query = '%{query}%'.format(query=query) if db().is_mysql(): having = 'name_ascii LIKE ? OR names LIKE ?' args = [like_query, like_query] else: having = """LOWER({name_query}) IN (SELECT word FROM fuzzy WHERE word MATCH ? AND distance <= {fuzzy_threshold}) OR {name_ascii_query} LIKE ? OR SUM(CASE WHEN LOWER(face_name) IN (SELECT word FROM fuzzy WHERE word MATCH ? AND distance <= {fuzzy_threshold}) THEN 1 ELSE 0 END) > 0 """.format(name_query=card.name_query().format(table='u'), name_ascii_query=card.name_query('name_ascii').format(table='u'), fuzzy_threshold=fuzzy_threshold) fuzzy_query = '{query}*'.format(query=query) args = [fuzzy_query, like_query, fuzzy_query] sql = """ {base_query} HAVING {having} ORDER BY pd_legal DESC, name """.format(base_query=base_query(), having=having) rs = db().execute(sql, args) return [card.Card(r) for r in rs]
def name_lookup(name: str) -> str: if name == 'Kongming, Sleeping Dragon': name = 'Kongming, "Sleeping Dragon"' elif name == 'Pang Tong, Young Phoenix': name = 'Pang Tong, "Young Phoenix"' try: if not CARDS: rs = db().select(multiverse.base_query()) for row in rs: CARDS[card.canonicalize(row['name'])] = row['name'] except DatabaseException: tb = traceback.format_exc() print(tb) if not CARDS: CARDS[ ''] = '' # Filler, so that we don't try to do this every lookup. canonical = card.canonicalize(name) if canonical not in CARDS: if CARDS.get('', None) is None: print('WARNING: Bogus name {name} ({canonical}) found.'.format( name=name, canonical=canonical)) return name return CARDS[canonical]
def bugged_cards(): sql = base_query() + "HAVING bug_desc IS NOT NULL" rs = db().execute(sql) return [card.Card(r) for r in rs]