Пример #1
0
def compile_condition_sql(condition, stat, prefix='current.'):
    ret = ''
    final_value = None

    if 'value' in condition:
        final_value = db.format(condition['value'])

    # ignore generated tags (identified by leading .)
    if condition['key'][0] == '.':
        return None

    if condition['op'][0:2] == '! ':
        return None

    # eval() statements
    if condition['op'] == 'eval':
        return None

    # value-eval() statements
    if condition['value_type'] == 'eval':
        # treat other conditions as has_key
        return prefix + 'tags ? ' + db.format(condition['key']);

    # =
    if condition['op'] == '=':
        ret += prefix + 'tags @> ' + db.format({ condition['key']: condition['value'] })

    else:
        return prefix + 'tags ? ' + db.format(condition['key']);

    return ret;
Пример #2
0
def compile_condition_sql(condition, statement, stat, prefix='current.', filter={}):
    ret = ''
    final_value = None

    if 'value' in condition:
        final_value = db.format(condition['value'])

    # ignore generated tags (identified by leading .)
    if condition['key'][0] == '.':
        f = filter.copy()
        f['has_set_tag'] = condition['key']
        f['max_id'] = statement['id']
        set_statements = stat_filter_statements(stat, f)

        if len(set_statements) == 0:
            return 'false'

        return '((' + ') or ('.join([
            compile_selector_sql(s, stat, prefix, filter)
            for s in set_statements
        ]) + '))'

    if condition['op'][0:2] == '! ':
        return None

    # eval() statements
    if condition['op'] == 'eval':
        return None

    # ignore pseudo classes
    if condition['op'] == 'pseudo_class':
        return None

    # eval() statements
    if condition['op'] in ('key_regexp', 'key_regexp_case'):
        return None

    # value-eval() statements
    if condition['value_type'] == 'eval':
        # treat other conditions as has_key
        return prefix + 'tags ? ' + db.format(condition['key']);

    # =
    if condition['op'] == '=':
        ret += prefix + 'tags @> ' + db.format({ condition['key']: condition['value'] })

    # @=
    if condition['op'] == '@=' and condition['value_type'] == 'value':
        ret += '(' + ' or '.join([
            prefix + 'tags @> ' + db.format({ condition['key']: v })
            for v in condition['value'].split(';')
            ]) + ')'

    else:
        return prefix + 'tags ? ' + db.format(condition['key']);

    return ret;
Пример #3
0
def build_sql_column(props, stat):
    sql_as = shorten_column(' '.join(props))

    prop_values = {
        k: stat.property_values(k)
        for k in props
    }
    default_props = {
        k: v.copy().pop()
        for k, v in prop_values.items()
        if len(v) == 1 and stat.property_default_value(k) in v
    }

    r = []
    first = 'default'
    last = 'default'
    for k in props:
        if k in default_props and default_props[k] is not True:
            r.append(default_props[k])
            last = 'default'
        else:
            if len(r) == 0:
                first = 'query'
            last = 'query'
            r.append("' || " + sql_convert_prop(k, 'properties->' + db.format(k), stat) + " || '")

    r = "'" + ' '.join(r) + "'"

    if first == 'query':
        r = r[6:]
    if last == 'query':
        r = r[:-6]

    return r + ' as "' + sql_as + '"'
Пример #4
0
def process_mapnik(style_id, args, stat, conn):
    f1 = resource_stream(__name__, args.base_style + '.mapnik')
    f2 = open(style_id + '.mapnik', 'w')

    replacement = {
        'style_id': style_id,
        'host': args.host,
        'password': args.password,
        'database': args.database,
        'user': args.user,
        'columns': '{columns}'
    }

    stat['mapnik_columns'] = set()

    # dirty hack - when render_context.bbox is null, pass type 'canvas' instead of style-element
    res = db.prepare("select * from pgmapcss_{style_id}(null, 0, Array['canvas']) where pseudo_element='default'".format(**replacement))
    result = res()
    if len(result) > 0:
        canvas_properties = result[0][res.column_names.index('properties')]
        canvas_properties = pghstore.loads(canvas_properties)

        for (k, v) in canvas_properties.items():
            replacement['canvas|' + k] = v or ''

    text = process(f1, replacement, stat)

    # style-element is an extra column in result set
    stat['mapnik_columns'].remove('style-element')

    # finally replace 'columns'
    replacement = {}
    replacement['columns'] = ',\n  '.join([
        ' || \' \' || '.join([
            '(properties->' + db.format(p) + ')'
            for p in props.split(' ')
        ]) + ' as "' + shorten_column(props) + '"'
        for props in stat['mapnik_columns']
    ])

    f2.write(text.format(**replacement))

    f1.close()
    f2.close()

    print('File ' + style_id + '.mapnik successfully written.')
Пример #5
0
def process_mapnik(style_id, args, stat, conn):
    f1 = resource_stream(__name__, args.base_style + '.mapnik')
    f2 = open(style_id + '.mapnik', 'w')

    replacement = {
        'style_id': style_id,
        'host': args.host,
        'password': args.password,
        'database': args.database,
        'user': args.user
    }

    replacement['columns'] = ', '.join([
        'properties->' + db.format(prop) + ' as ' + db.ident(prop)
        for prop in stat_properties(stat)
    ])

    # dirty hack - when render_context.bbox is null, pass type 'canvas' instead of style-element
    res = db.prepare("select * from {style_id}_match(null, 0, Array['canvas'])".format(**replacement))
    result = res()
    if len(result) > 0:
        canvas_properties = result[0][res.column_names.index('properties')]
        canvas_properties = pghstore.loads(canvas_properties)

        for (k, v) in canvas_properties.items():
            replacement['canvas|' + k] = v or ''

    f2.write(process(f1, replacement, stat))

    f1.close()
    f2.close()

    print('File ' + style_id + '.mapnik successfully written.')

    if len(unresolvable_properties):
        print('WARNING: Not all values for the following properties could be guessed (e.g. as they are the result of an eval-expression, and therefore some features in the resulting image(s) may be missing: ' + ', '.join(unresolvable_properties))