vector<SCassSizeEstimate> NormalizeSizeEstimates(vector<SCassSizeEstimate>
const&
input)
52vector<SCassSizeEstimate>
output;
55 for(
auto const& estimate :
input) {
56 if(estimate.range_start > current_range_start) {
59new_estimate.
range_end= estimate.range_start;
63(estimate.range_end - estimate.range_start);
65 output.push_back(new_estimate);
67current_range_start = estimate.range_end;
68 output.push_back(estimate);
78(
last->range_end -
last->range_start);
80 output.push_back(new_estimate);
86 voidVerifySizeEstimates(vector<SCassSizeEstimate>
const& estimates)
95 for(
autoitr = estimates.cbegin(); itr != estimates.cend(); ++itr) {
96 if(itr->range_start >= itr->range_end) {
98<< itr->range_start <<
":"<< itr->range_end);
100 if(itr->partitions_count < 0) {
102<< itr->range_start <<
":"<< itr->range_end <<
" - "<< itr->partitions_count);
105 if(
next!= estimates.cend() && itr->range_end !=
next->range_start) {
107<< itr->range_start <<
":"<< itr->range_end
108<<
" and "<<
next->range_start <<
":"<<
next->range_end);
113constexpr
char const*
constkParamMinPartitionsForSubrangeScan =
"plan_partitions_for_subrange_scan";
114constexpr
char const*
constkParamPartitionCountPerQuery =
"plan_partition_count_per_query";
169 ERR_POST(
Warning<<
"CCassandraFullscanPlanner::SetPartitionCountPerQueryLimit - wrong value ignored '"<<
value<<
"'");
183 stringdatacenter,
schema, schema_bytes;
184 int64_tpeers_count{0}, partition_count{0};
187 query->SetSQL(
"SELECT data_center, schema_version, uuidAsBlob(schema_version) FROM system.local", 0);
188 query->Query(CassConsistency::CASS_CONSISTENCY_LOCAL_ONE,
false,
false);
190datacenter =
query->FieldGetStrValue(0);
192schema_bytes =
query->FieldGetStrValue(2);
193 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - Datacenter '"<< datacenter <<
"'");
194 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - Schema '"<<
schema<<
"'");
195 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - Bytes size "<< schema_bytes.size());
198 query->SetSQL(
"SELECT count(*) FROM system.peers WHERE data_center = ? and schema_version = ? ALLOW FILTERING", 2);
199 query->BindStr(0, datacenter);
200 query->BindBytes(1,
reinterpret_cast<const unsigned char*
>(schema_bytes.c_str()), schema_bytes.size());
201 query->Query(CassConsistency::CASS_CONSISTENCY_LOCAL_ONE,
false,
false);
203peers_count =
query->FieldGetInt64Value(0, 0);
204 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - Peers count '"<< peers_count <<
"'");
207 query->SetSQL(
"SELECT partitions_count FROM system.size_estimates WHERE table_name = ? AND keyspace_name = ?", 2);
210 query->Query(CassConsistency::CASS_CONSISTENCY_LOCAL_ONE,
false,
false);
212partition_count +=
query->FieldGetInt64Value(0);
215 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - " 216 "Local rows estimate - '"<< partition_count <<
"'");
217 ERR_POST(
Trace<<
"CCassandraFullscanPlanner::GetTableRowsCountEstimate - " 218 "Total rows estimate - '"<< partition_count * (peers_count + 1) <<
"'");
220 returnpartition_count * (peers_count + 1);
225shared_ptr<CCassQuery>
query;
229 unsigned inttoken_count{0};
256 ERR_POST(
Trace<<
"CCassandraFullscanPlan::SplitTokenRangesForLimits - " 257 "Local dc - '"<< local_dc <<
"'");
259 ERR_POST(
Trace<<
"CCassandraFullscanPlan::SplitTokenRangesForLimits - " 260 "Local estimates size - '"<< local_estimates.size() <<
"'");
261 autoestimates = NormalizeSizeEstimates(local_estimates);
264VerifySizeEstimates(estimates);
266 autosearch_start = begin(estimates);
269 autorange_start = range.first;
270 autorange_end = range.second;
273 autoitr = search_start;
274 while(itr != end(estimates) && itr->range_end <= range_start) {
281 while(itr != end(estimates) && itr->range_start < range_end) {
282 autointersect_start =
max(itr->range_start, range_start);
283 autointersect_end =
min(itr->range_end, range_end);
285(1.0 * (intersect_end - intersect_start)) /
286(itr->range_end - itr->range_start);
287partitions_count += size_ratio * itr->partitions_count;
295 int64_tstep = (range_end - range_start) / parts;
297 autostart = range_start;
298 while(start < range_end) {
299 autoend = (range_end - start) < step ? range_end : (start + step);
300result_ranges.push_back(make_pair(start, end));
304result_ranges.push_back(range);
307result_ranges.push_back(range);
340 stringpartition =
NStr::Join(partition_fields,
",");
342+
m_Keyspace+
"."+
m_Table+
" WHERE TOKEN("+ partition +
") > ? AND TOKEN("+ partition +
") <= ?";
#define BEGIN_IDBLOB_SCOPE
vector< pair< TTokenValue, TTokenValue > > TTokenRanges
TParamsBinder m_WhereFilterParamsBinder
void SplitTokenRangesForLimits()
unsigned int m_WhereFilterParamsCount
CCassandraFullscanPlan & SetConnection(shared_ptr< CCassConnection > connection)
CCassandraFullscanPlan & SetWhereFilter(string const &where_filter)
size_t GetMinPartitionsForSubrangeScan()
TQueryPtr GetNextQuery() override
size_t m_MinPartitionsForSubrangeScan
size_t GetPartitionCountEstimate()
shared_ptr< CCassQuery > TQueryPtr
shared_ptr< CCassConnection > m_Connection
static constexpr size_t kMinPartitionsForSubrangeScanDefault
size_t GetQueryCount() const override
int64_t m_PartitionCountPerQueryLimit
CCassandraFullscanPlan & SetTable(string const &table)
CCassandraFullscanPlan & SetFieldList(vector< string > fields)
CCassandraFullscanPlan & SetMinPartitionsForSubrangeScan(size_t value)
vector< string > m_FieldList
CCassandraFullscanPlan & SetKeyspace(string const &keyspace)
void ApplyConfiguration(IRegistry const *registry, string const §ion) override
CCassandraFullscanPlan & SetPartitionCountPerQueryLimit(int64_t value)
CCassConnection::TTokenRanges & GetTokenRanges()
CCassConnection::TTokenRanges m_TokenRanges
function< void(CCassQuery &query, int first_param_index)> TParamsBinder
The NCBI C++ standard methods for dealing with std::string.
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static SQLCHAR output[256]
static const char * schema
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
void Trace(CExceptionArgs_Base &args)
void Warning(CExceptionArgs_Base &args)
#define NCBI_THROW_FMT(exception_class, err_code, message)
The same as NCBI_THROW but with message processed as output to ostream.
virtual int GetInt(const string §ion, const string &name, int default_value, TFlags flags=0, EErrAction err_action=eThrow) const
Get integer value of specified parameter name.
static string Join(const TContainer &arr, const CTempString &delim)
Join strings using the specified delimiter.
<!DOCTYPE HTML >< html > n< header > n< title > PubSeq Gateway Help Page</title > n< style > n table
const GenericPointer< typename T::ValueType > T2 value
BEGIN_IDBLOB_SCOPE USING_NCBI_SCOPE
int64_t mean_partition_size
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4