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;
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;
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 + '"'
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.')
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))