Skip to content

Commit dba448f

Browse files
committed
Changed area criterion strategy to favor small areas that are explicitly named
1 parent a707847 commit dba448f

File tree

2 files changed

+48
-29
lines changed

2 files changed

+48
-29
lines changed

src/overpass_api/statements/area_query.cc

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ class Area_Constraint : public Query_Constraint
5656
};
5757

5858

59+
void copy_discrete_to_area_ranges(
60+
const std::set< Uint31_Index >& area_blocks_req,
61+
std::set< std::pair< Uint32_Index, Uint32_Index > >& nodes_req)
62+
{
63+
nodes_req.clear();
64+
for (std::set< Uint31_Index >::const_iterator it = area_blocks_req.begin(); it != area_blocks_req.end(); ++it)
65+
nodes_req.insert(std::make_pair(Uint32_Index(it->val()), Uint32_Index((it->val()) + 0x100)));
66+
}
67+
68+
5969
bool Area_Constraint::get_ranges
6070
(Resource_Manager& rman, std::set< std::pair< Uint32_Index, Uint32_Index > >& ranges)
6171
{
@@ -65,10 +75,12 @@ bool Area_Constraint::get_ranges
6575
if (!input)
6676
return true;
6777

68-
area->get_ranges(input->areas, ranges, area_blocks_req, rman);
78+
area->get_ranges(input->areas, area_blocks_req, rman);
6979
}
7080
else
71-
area->get_ranges(ranges, area_blocks_req, rman);
81+
area->get_ranges(area_blocks_req, rman);
82+
83+
copy_discrete_to_area_ranges(area_blocks_req, ranges);
7284

7385
return true;
7486
}
@@ -106,15 +118,14 @@ void Area_Constraint::filter(Resource_Manager& rman, Set& into)
106118
void Area_Constraint::filter(const Statement& query, Resource_Manager& rman, Set& into)
107119
{
108120
std::set< Uint31_Index > area_blocks_req;
109-
std::set< std::pair< Uint32_Index, Uint32_Index > > range_req;
110121
if (area->areas_from_input())
111122
{
112123
const Set* input = rman.get_set(area->get_input());
113124
if (input)
114-
area->get_ranges(input->areas, range_req, area_blocks_req, rman);
125+
area->get_ranges(input->areas, area_blocks_req, rman);
115126
}
116127
else
117-
area->get_ranges(range_req, area_blocks_req, rman);
128+
area->get_ranges(area_blocks_req, rman);
118129

119130
//Process nodes
120131
area->collect_nodes(into.nodes, area_blocks_req, true, rman);
@@ -225,7 +236,7 @@ Statement* Area_Query_Statement::Criterion_Maker::create_criterion(const Token_N
225236

226237
Area_Query_Statement::Area_Query_Statement
227238
(int line_number_, const std::map< std::string, std::string >& input_attributes, Parsed_Query& global_settings)
228-
: Output_Statement(line_number_)
239+
: Output_Statement(line_number_), area_blocks_req_filled(false)
229240
{
230241
is_used_ = true;
231242

@@ -259,10 +270,25 @@ Area_Query_Statement::~Area_Query_Statement()
259270
}
260271

261272

262-
void Area_Query_Statement::get_ranges
263-
(std::set< std::pair< Uint32_Index, Uint32_Index > >& nodes_req,
264-
std::set< Uint31_Index >& area_block_req,
265-
Resource_Manager& rman)
273+
unsigned int Area_Query_Statement::count_ranges(Resource_Manager& rman)
274+
{
275+
if (!area_blocks_req_filled)
276+
fill_ranges(rman);
277+
278+
return area_blocks_req.size();
279+
}
280+
281+
282+
void Area_Query_Statement::get_ranges(std::set< Uint31_Index >& area_blocks_req, Resource_Manager& rman)
283+
{
284+
if (!area_blocks_req_filled)
285+
fill_ranges(rman);
286+
287+
area_blocks_req = this->area_blocks_req;
288+
}
289+
290+
291+
void Area_Query_Statement::fill_ranges(Resource_Manager& rman)
266292
{
267293
Block_Backend< Uint31_Index, Area_Skeleton > area_locations_db
268294
(rman.get_area_transaction()->data_index(area_settings().AREAS));
@@ -274,21 +300,16 @@ void Area_Query_Statement::get_ranges
274300
{
275301
for (std::vector< uint32 >::const_iterator it2(it.object().used_indices.begin());
276302
it2 != it.object().used_indices.end(); ++it2)
277-
{
278-
area_block_req.insert(Uint31_Index(*it2));
279-
std::pair< Uint32_Index, Uint32_Index > range
280-
(std::make_pair(Uint32_Index(*it2), Uint32_Index((*it2) + 0x100)));
281-
nodes_req.insert(range);
282-
}
303+
area_blocks_req.insert(Uint31_Index(*it2));
283304
}
284305
}
306+
area_blocks_req_filled = true;
285307
}
286308

287309

288310
void Area_Query_Statement::get_ranges
289311
(const std::map< Uint31_Index, std::vector< Area_Skeleton > >& input_areas,
290-
std::set< std::pair< Uint32_Index, Uint32_Index > >& nodes_req,
291-
std::set< Uint31_Index >& area_block_req,
312+
std::set< Uint31_Index >& area_blocks_req,
292313
Resource_Manager& rman)
293314
{
294315
area_id.clear();
@@ -301,12 +322,7 @@ void Area_Query_Statement::get_ranges
301322

302323
for (std::vector< uint32 >::const_iterator it3(it2->used_indices.begin());
303324
it3 != it2->used_indices.end(); ++it3)
304-
{
305-
area_block_req.insert(Uint31_Index(*it3));
306-
std::pair< Uint32_Index, Uint32_Index > range
307-
(std::make_pair(Uint32_Index(*it3), Uint32_Index((*it3) + 0x100)));
308-
nodes_req.insert(range);
309-
}
325+
area_blocks_req.insert(Uint31_Index(*it3));
310326
}
311327
}
312328

@@ -317,7 +333,7 @@ void Area_Query_Statement::get_ranges
317333
bool Area_Constraint::delivers_data(Resource_Manager& rman)
318334
{
319335
if (!area->areas_from_input())
320-
return false;
336+
return (area->count_ranges(rman) < 12);
321337
else
322338
{
323339
const Set* input = rman.get_set(area->get_input());

src/overpass_api/statements/area_query.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,13 @@ class Area_Query_Statement : public Output_Statement
5757
virtual Query_Constraint* get_query_constraint();
5858

5959
void get_ranges
60-
(std::set< std::pair< Uint32_Index, Uint32_Index > >& nodes_req,
61-
std::set< Uint31_Index >& area_block_req,
60+
(std::set< Uint31_Index >& area_blocks_req,
6261
Resource_Manager& rman);
62+
unsigned int count_ranges(Resource_Manager& rman);
6363

6464
void get_ranges
6565
(const std::map< Uint31_Index, std::vector< Area_Skeleton > >& input_areas,
66-
std::set< std::pair< Uint32_Index, Uint32_Index > >& nodes_req,
67-
std::set< Uint31_Index >& area_block_req,
66+
std::set< Uint31_Index >& area_blocks_req,
6867
Resource_Manager& rman);
6968

7069
void collect_nodes
@@ -117,8 +116,12 @@ class Area_Query_Statement : public Output_Statement
117116
std::string input;
118117
long long submitted_id;
119118
std::vector< Area_Skeleton::Id_Type > area_id;
119+
std::set< Uint31_Index > area_blocks_req;
120+
bool area_blocks_req_filled;
120121
static bool is_used_;
121122
std::vector< Query_Constraint* > constraints;
123+
124+
void fill_ranges(Resource_Manager& rman);
122125
};
123126

124127

0 commit comments

Comments
 (0)