@@ -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+
5969bool 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)
106118void 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
226237Area_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
288310void 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
317333bool 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 ());
0 commit comments