Exemplo n.º 1
0
def check_search_name_contents(context, exclude):
    """ Check contents of place/placex tables. Each row represents a table row
        and all data must match. Data not present in the expected table, may
        be arbitry. The rows are identified via the 'object' column which must
        have an identifier of the form '<NRW><osm id>[:<class>]'. All
        expected rows are expected to be present with at least one database row.
    """
    with context.db.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
        for row in context.table:
            nid = NominatimID(row['object'])
            nid.row_by_place_id(
                cur, 'search_name',
                ['ST_X(centroid) as cx', 'ST_Y(centroid) as cy'])
            assert cur.rowcount > 0, "No rows found for " + row['object']

            for res in cur:
                db_row = DBRow(nid, res, context)
                for name, value in zip(row.headings, row.cells):
                    if name in ('name_vector', 'nameaddress_vector'):
                        items = [x.strip() for x in value.split(',')]
                        with context.db.cursor() as subcur:
                            subcur.execute(
                                """ SELECT word_id, word_token
                                               FROM word, (SELECT unnest(%s::TEXT[]) as term) t
                                               WHERE word_token = make_standard_name(t.term)
                                                     and class is null and country_code is null
                                                     and operator is null
                                              UNION
                                               SELECT word_id, word_token
                                               FROM word, (SELECT unnest(%s::TEXT[]) as term) t
                                               WHERE word_token = ' ' || make_standard_name(t.term)
                                                     and class is null and country_code is null
                                                     and operator is null
                                           """,
                                (list(
                                    filter(lambda x: not x.startswith('#'),
                                           items)),
                                 list(
                                     filter(lambda x: x.startswith('#'),
                                            items))))
                            if not exclude:
                                assert subcur.rowcount >= len(items), \
                                    "No word entry found for {}. Entries found: {!s}".format(value, subcur.rowcount)
                            for wid in subcur:
                                present = wid[0] in res[name]
                                if exclude:
                                    assert not present, "Found term for {}/{}: {}".format(
                                        row['object'], name, wid[1])
                                else:
                                    assert present, "Missing term for {}/{}: {}".fromat(
                                        row['object'], name, wid[1])
                    elif name != 'object':
                        assert db_row.contains(name, value), db_row.assert_msg(
                            name, value)
Exemplo n.º 2
0
def check_search_name_contents(context, exclude):
    """ Check contents of place/placex tables. Each row represents a table row
        and all data must match. Data not present in the expected table, may
        be arbitry. The rows are identified via the 'object' column which must
        have an identifier of the form '<NRW><osm id>[:<class>]'. All
        expected rows are expected to be present with at least one database row.
    """
    tokenizer = tokenizer_factory.get_tokenizer_for_db(
        context.nominatim.get_test_config())

    with tokenizer.name_analyzer() as analyzer:
        with context.db.cursor(
                cursor_factory=psycopg2.extras.DictCursor) as cur:
            for row in context.table:
                nid = NominatimID(row['object'])
                nid.row_by_place_id(
                    cur, 'search_name',
                    ['ST_X(centroid) as cx', 'ST_Y(centroid) as cy'])
                assert cur.rowcount > 0, "No rows found for " + row['object']

                for res in cur:
                    db_row = DBRow(nid, res, context)
                    for name, value in zip(row.headings, row.cells):
                        if name in ('name_vector', 'nameaddress_vector'):
                            items = [x.strip() for x in value.split(',')]
                            tokens = analyzer.get_word_token_info(
                                context.db, items)

                            if not exclude:
                                assert len(tokens) >= len(items), \
                                       "No word entry found for {}. Entries found: {!s}".format(value, len(tokens))
                            for word, token, wid in tokens:
                                if exclude:
                                    assert wid not in res[name], \
                                           "Found term for {}/{}: {}".format(nid, name, wid)
                                else:
                                    assert wid in res[name], \
                                           "Missing term for {}/{}: {}".format(nid, name, wid)
                        elif name != 'object':
                            assert db_row.contains(name,
                                                   value), db_row.assert_msg(
                                                       name, value)