You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openstreetmap-carto/scripts/test-queries.py

85 lines
2.9 KiB
Python

#!/usr/bin/env python3
""""
Tests the queries in a CartoCSS MML file against a database.
Ignore database settings in the MML file.
"""
import argparse
import logging
import psycopg2
import yaml
EMPTY_POLYGON="""ST_SetSRID('POLYGON EMPTY'::geometry, 3857)"""
class ResultHasRowsError(Exception):
"""Class for layers that have """
pass
def testLayer(layer, curs):
datasource = layer["Datasource"]
if datasource["type"] != "postgis":
logging.warning("Layer type {} not supported".format(layer["type"]))
return
geometry_field=datasource["geometry_field"]
full_query = """
SELECT "{}" FROM
{}
""".format(geometry_field, datasource["table"])
if "!bbox!" not in full_query:
full_query += "\nWHERE {} && !bbox!".format(geometry_field)
query = full_query.replace("!bbox!", EMPTY_POLYGON).replace("!pixel_width!", "0").replace("!pixel_height!", "0").replace("!scale_denominator!", "0")
logging.debug("Running query {}".format(query))
curs.execute(query)
if curs.rowcount != 0:
raise ResultHasRowsError(query)
def main():
# parse options
parser = argparse.ArgumentParser(
description="Test CartoCSS project queries against a database")
parser.add_argument("-d", "--database", action="store", default="gis",
help="Override database name to connect to")
parser.add_argument("-H", "--host", action="store",
help="Override database server host or socket directory")
parser.add_argument("-p", "--port", action="store",
help="Override database server port")
parser.add_argument("-U", "--username", action="store",
help="Override database user name")
parser.add_argument("-v", "--verbose", action="store_true",
help="Be more verbose. Overrides -q")
parser.add_argument("-q", "--quiet", action="store_true",
help="Only report serious problems")
parser.add_argument("-w", "--password", action="store",
help="Override database password")
parser.add_argument('project', type=argparse.FileType('r'),
help="CartoCSS MML file")
opts = parser.parse_args()
if opts.verbose:
logging.basicConfig(level=logging.DEBUG)
elif opts.quiet:
logging.basicConfig(level=logging.WARNING)
else:
logging.basicConfig(level=logging.INFO)
mml=yaml.safe_load(opts.project)
logging.debug("Loaded MML")
with psycopg2.connect(database=opts.database, host=opts.host,
port=opts.port, user=opts.username,
password=opts.password).cursor() as curs:
curs.execute("SET default_transaction_read_only = TRUE;")
for layer in mml["Layer"]:
testLayer(layer, curs)
if __name__ == '__main__':
main()