FOR linked_placex IN
SELECT placex.* from placex
WHERE make_standard_name(name->'name') = bnd_name
- AND ((bnd.rank_address > 0 and placex.rank_address = bnd.rank_address)
+ AND ((bnd.rank_address > 0
+ and bnd.rank_address = (compute_place_rank(placex.country_code,
+ 'N', placex.class,
+ placex.type, 15::SMALLINT,
+ false, placex.postcode)).address_rank)
OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))
AND placex.osm_type = 'N'
AND placex.rank_search < 26 -- needed to select the right index
NEW.rank_address := parent_address_level + 2;
END IF;
END IF;
+ -- If a place node is contained in a admin boundary with the same address level
+ -- and has not been linked, then make the node a subpart by increasing the
+ -- address rank (city level and above).
+ ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
+ and NEW.rank_address between 16 and 23
+ THEN
+ FOR location IN
+ SELECT rank_address FROM placex
+ WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'
+ and rank_address = NEW.rank_address
+ and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)
+ LIMIT 1
+ LOOP
+ NEW.rank_address = NEW.rank_address + 2;
+ END LOOP;
ELSE
parent_address_level := 3;
END IF;
AS $$
BEGIN
IF rank_search <= 16 THEN -- city
- RETURN 7500;
+ RETURN 15000;
ELSIF rank_search <= 18 THEN -- town
RETURN 4000;
ELSIF rank_search <= 19 THEN -- village
When sending json search query "Schellingstr 86, Hamburg" with address
| accept-language |
| de |
- Then address of result 0 is
+ Then address of result 0 contains
| type | value |
| house_number | 86 |
| road | Schellingstraße |
- | suburb | Eilbek |
| postcode | 22089 |
| city | Hamburg |
| country | Deutschland |
When sending json search query "Schellingstr 73, Hamburg" with address
| accept-language |
| de |
- Then address of result 0 is
+ Then address of result 0 contains
| type | value |
| house_number | 73 |
| road | Schellingstraße |
- | suburb | Eilbek |
| postcode | 22089 |
| city | Hamburg |
| country | Deutschland |
else:
assert_in(attr, addr_parts)
-@then(u'address of result (?P<lid>\d+) is')
-def check_address(context, lid):
+@then(u'address of result (?P<lid>\d+) (?P<complete>is|contains)')
+def check_address(context, lid, complete):
context.execute_steps("then more than %s results are returned" % lid)
addr_parts = dict(context.response.result[int(lid)]['address'])
"Bad address value for %s" % line['type'])
del addr_parts[line['type']]
- eq_(0, len(addr_parts), "Additional address parts found: %s" % str(addr_parts))
+ if complete == 'is':
+ eq_(0, len(addr_parts), "Additional address parts found: %s" % str(addr_parts))
@then(u'result (?P<lid>\d+ )?has bounding box in (?P<coords>[\d,.-]+)')
def step_impl(context, lid, coords):