10 #include <unordered_map> 22 typedef unsigned int u32;
23 typedef unsigned long long u64;
34 is_load_balanced =
false;
35 use_load_balance =
false;
47 is_load_balanced =
false;
48 use_load_balance =
false;
60 is_load_balanced =
false;
61 use_load_balance =
false;
78 attr(index, low, up, weight, -1, order);
84 attr(index, value, value, weight, selectivity, order);
90 if (index < 0 || index >= _ref_table->m_size())
98 new_attr.
query = _index;
104 if (_attr_map.find(index) == _attr_map.end())
108 _attr_map[
index] = vector<range>();
111 _attr_map[
index].push_back(new_attr);
118 if (_attr_map.find(index) == _attr_map.end())
125 _count -= _attr_map[
index].size();
126 _attr_map[
index].clear();
127 _attr_map[
index].shrink_to_fit();
128 _attr_map.erase(index);
147 Logger::log(Logger::ALERT,
"Please set a valid max_load.");
153 for(
auto di = _dim_map.begin() ; di != _dim_map.end(); ++di)
155 std::vector<dim>& dims = di->second;
156 for(
unsigned int i = 0; i < dims.size(); ++i)
158 unsigned int length = dims[i].end_pos - dims[i].start_pos;
159 if((
unsigned int)max_load > length)
161 _dims.push_back(dims[i]);
165 for(; max_load*j <= length; ++j)
168 new_dim.
query = dims[i].query;
169 new_dim.
order = dims[i].order;
170 new_dim.
weight = dims[i].weight;
173 _dims.push_back(new_dim);
175 if(max_load*(j-1) != length)
178 new_dim.
query = dims[i].query;
179 new_dim.
order = dims[i].order;
180 new_dim.
weight = dims[i].weight;
182 new_dim.
end_pos = dims[i].end_pos;
183 _dims.push_back(new_dim);
202 Logger::log(Logger::ALERT,
203 "Please build the inverted table before applying adaptive query range.");
207 u32 global_threshold = _selectivity > 0 ?
u32(ceil(_selectivity * table.
i_size())) : 0;
210 for (
auto di = _attr_map.begin(); di != _attr_map.end(); ++di)
212 std::vector<range>* ranges = &(di->second);
213 int index = di->first;
215 for (
unsigned int i = 0; i < ranges->size(); ++i)
217 range& d = ranges->at(i);
222 else if (_selectivity > 0)
224 local_threshold = global_threshold;
228 Logger::log(Logger::ALERT,
"Please set valid selectivity!");
232 unsigned int count = 0;
233 for (
int vi = d.
low; vi <= d.
up; ++vi)
239 while (count < local_threshold)
278 unordered_map<size_t, int>& inv_index_map = *table.
inv_index_map();
279 vector<int>& inv_pos = *table.
inv_pos();
281 for (
auto di = _attr_map.begin(); di != _attr_map.end(); ++di)
283 int index = di->first;
284 std::vector<range>& ranges = di->second;
285 int d = index << _ref_table->shifter();
292 if (_dim_map.find(index) == _dim_map.end())
296 _dim_map[
index] = vector<dim>();
299 for (
unsigned int i = 0; i < ranges.size(); ++i)
302 range& ran = ranges[i];
314 new_dim.
query = _index;
327 new_dim.
start_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_min))->second];
328 new_dim.
end_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_max+1))->second];
330 _dim_map[
index].push_back(new_dim);
339 unordered_map<size_t, int> &inv_index_map = *_ref_table->inv_index_map();
340 vector<int> &inv_pos = *_ref_table->inv_pos();
342 for (
auto di = _attr_map.begin(); di != _attr_map.end(); ++di)
344 int index = di->first;
345 vector<range> &ranges = di->second;
346 int d = index << _ref_table->shifter();
351 for (
size_t i = 0; i < ranges.size(); ++i)
353 range &ran = ranges[i];
359 if (low > up || low > _ref_table->get_upperbound_of_list(index) || up < _ref_table->get_lowerbound_of_list(index))
362 low = low < _ref_table->get_lowerbound_of_list(index) ? _ref_table->get_lowerbound_of_list(index) : low;
363 up = up > _ref_table->get_upperbound_of_list(index) ? _ref_table->get_upperbound_of_list(index) : up;
367 _min = d + low - _ref_table->get_lowerbound_of_list(index);
368 _max = d + up - _ref_table->get_lowerbound_of_list(index);
370 start_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_min))->second];
371 end_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_max+1))->second];
373 dims.emplace_back(_index, order, start_pos, end_pos, weight);
383 unordered_map<size_t, int>& inv_index_map = *table.
inv_index_map();
384 vector<int>& inv_pos = *table.
inv_pos();
388 for (
auto di = _attr_map.begin(); di != _attr_map.end(); ++di)
391 int index = di->first;
393 if(_distinct.size() <= 0)
continue;
395 unordered_map<int, int>::iterator itt = _distinct.begin();
397 std::vector<range>& ranges = di->second;
398 int d = index << _ref_table->shifter();
406 if (_dim_map.find(index) == _dim_map.end())
410 _dim_map[
index] = vector<dim>();
413 for (
unsigned int i = 0; i < ranges.size(); ++i)
416 range& ran = ranges[i];
422 unordered_map<int, int>::iterator it = _distinct.find(low);
423 if(it != _distinct.end())
439 new_dim.
query = _index;
452 new_dim.
start_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_min))->second];
453 new_dim.
end_pos = inv_pos[inv_index_map.find(static_cast<size_t>(_max+1))->second];
455 _dim_map[
index].push_back(new_dim);
464 void genie::query::Query::build_compressed(
int max_load)
467 unordered_map<size_t, int>& inv_index_map = *table.
inv_index_map();
468 vector<int>& inv_pos = *table.
inv_pos();
470 for (std::map<
int, std::vector<range>>::iterator di = _attr_map.begin();
471 di != _attr_map.end(); ++di)
473 int index = di->first;
474 std::vector<range> &ranges = di->second;
475 int d = index << _ref_table->shifter();
480 if (_dim_map.find(index) == _dim_map.end())
481 _dim_map[index] = std::vector<dim>();
483 for (
unsigned int i = 0; i < ranges.size(); ++i)
486 range& ran = ranges[i];
501 int beginInvListIndex = inv_index_map.find(static_cast<size_t>(_min))->second;
503 int endInvListIndex = inv_index_map.find(static_cast<size_t>(_max+1))->second;
505 assert (endInvListIndex > beginInvListIndex);
510 assert(beginInvListIndex + 1 == endInvListIndex);
513 for (
int ipos = beginInvListIndex; ipos < endInvListIndex; ipos++){
514 assert(inv_pos[ipos+1] - inv_pos[ipos+1] <= max_load);
519 std::vector<dim> &compiledQueriesVec = _dim_map[
index];
520 for (
int ipos = beginInvListIndex; ipos < endInvListIndex; ipos++){
523 new_dim.
query = _index;
526 new_dim.
end_pos = inv_pos[ipos+1];
528 compiledQueriesVec.push_back(new_dim);
540 for(
unsigned int i = 0; i <
_dims.size(); ++i)
542 vout.push_back(
_dims[i]);
547 for (std::map<
int, std::vector<dim>>::iterator di = _dim_map.begin();
548 di != _dim_map.end(); ++di)
550 std::vector<dim> &ranges = di->second;
551 count += ranges.size();
554 for (
unsigned int i = 0; i < ranges.size(); ++i)
556 vout.push_back(ranges[i]);
567 for (std::map<
int, std::vector<range>>::iterator di = _attr_map.begin();
568 di != _attr_map.end(); ++di)
570 std::vector<range> &rangesInAttr = di->second;
571 count += rangesInAttr.size();
573 for (
range &r : rangesInAttr)
591 Logger::log(Logger::DEBUG,
"This query has %d dimensions.",
594 for (
auto di = _attr_map.begin(); di != _attr_map.end(); ++di)
596 std::vector<range>& ranges = di->second;
597 for (
unsigned int i = 0; i < ranges.size(); ++i)
603 range& d = ranges[i];
604 Logger::log(Logger::DEBUG,
605 "dim %d from query %d: low %d(offset %d), up %d(offset %d), weight %.2f, selectivity %.2f.",
void build_and_apply_load_balance(int max_load)
The function would construct query in the setting where load balance feature is on.
std::unordered_map< size_t, int > * inv_index_map()
virtual std::vector< int > * inv_pos()
int get_upperbound_of_list(int attr_index)
The declaration for class inv_table.
void build_sequence()
build query dim for sequence search
int topk()
Get top k matches.
void print(int limit)
Print out the information of all dims.
Declaration of query class.
genie::table::inv_table * ref_table()
The refrenced table's pointer.
int dump(std::vector< dim > &vout)
virtual std::vector< int > * inv_pos()
std::unordered_map< int, int > * get_distinct_map(int dim)
std::vector< dim > _dims
Collection of dims of all queries.
void apply_adaptive_query_range()
Construct query in adaptice range mode.
Query class includes the functions for processing queries based on user's input.
void clear()
Clear the inv_table.
int get_lowerbound_of_list(int attr_index)
int count_ranges()
Get value of _ count.
The first-step struct for processing queries.
float selectivity()
The selectivity of the current settings.
int get_posting_list_size(int attr_index, int value)
void clear_dim(int index)
Delete the dim at index.
Record run-time information.
void attr(int index, int low, int up, float weight, int order)
Modify the matching range and weight of an attribute.
The second-step struct for processing queries.
int index()
Get index of the query.
bool is_load_balanced
Whether this query set has been applied load balance feature.
define class inv_compre_table
bool list_contain(int attr_index, int value)
Test whether a value is possible for an specific attribute.
void build()
Construct the query based on a normal table.