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.