summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2023-07-23 14:32:08 -0400
committerDouglas Rumbaugh <dbr4@psu.edu>2023-07-23 14:34:25 -0400
commite69b88d2e0449432174740b6a4953079513f7db1 (patch)
treeec3a1a8bf6f7858e37c66ade47846f14d9d74350
parentfc8b4c14bd2814447b5d3180c4ecf3742196c6bf (diff)
downloaddynamic-extension-e69b88d2e0449432174740b6a4953079513f7db1.tar.gz
Triespline RQ fixes
-rw-r--r--benchmarks/triespline_rq_bench.cpp6
-rw-r--r--include/shard/TrieSpline.h33
2 files changed, 29 insertions, 10 deletions
diff --git a/benchmarks/triespline_rq_bench.cpp b/benchmarks/triespline_rq_bench.cpp
index a61b273..0c4a0fe 100644
--- a/benchmarks/triespline_rq_bench.cpp
+++ b/benchmarks/triespline_rq_bench.cpp
@@ -32,18 +32,18 @@ int main(int argc, char **argv)
auto queries = read_range_queries<de::ts_range_query_parms<Rec>>(query_file, .0001);
std::fstream datafile;
- datafile.open(filename, std::ios::in);
+ datafile.open(filename, std::ios::in | std::ios::binary);
std::vector<Rec> to_delete;
// warm up the tree with initial_insertions number of initially inserted
// records
size_t warmup_cnt = insert_batch * record_count;
- warmup<ExtendedTSRQ, Rec>(datafile, de, warmup_cnt, delete_prop, to_delete);
+ warmup<ExtendedTSRQ, Rec>(datafile, de, warmup_cnt, delete_prop, to_delete, true, true);
size_t insert_cnt = record_count - warmup_cnt;
- insert_tput_bench<ExtendedTSRQ, Rec>(de, datafile, insert_cnt, delete_prop, to_delete);
+ insert_tput_bench<ExtendedTSRQ, Rec>(de, datafile, insert_cnt, delete_prop, to_delete, true);
fprintf(stdout, "%ld\t", de.get_memory_usage());
query_latency_bench<ExtendedTSRQ, Rec, de::ts_range_query_parms<Rec>>(de, queries, 1);
diff --git a/include/shard/TrieSpline.h b/include/shard/TrieSpline.h
index b068313..d09d2a6 100644
--- a/include/shard/TrieSpline.h
+++ b/include/shard/TrieSpline.h
@@ -279,6 +279,10 @@ private:
}
+ if (m_data[idx].rec.key > key && idx > 0 && m_data[idx-1].rec.key <= key) {
+ return idx-1;
+ }
+
return (m_data[idx].rec.key <= key) ? idx : m_reccnt;
}
@@ -329,10 +333,17 @@ public:
}
auto ptr = ts->get_record_at(s->start_idx);
- size_t i = 0;
- while (ptr[i].rec.key <= p->upper_bound && i < s->stop_idx - s->start_idx) {
- records.emplace_back(ptr[i]);
- i++;
+
+ // roll the pointer forward to the first record that is
+ // greater than or equal to the lower bound.
+ while(ptr->rec.key < p->lower_bound) {
+ ptr++;
+ }
+
+
+ while (ptr->rec.key <= p->upper_bound && ptr < ts->m_data + s->stop_idx) {
+ records.emplace_back(*ptr);
+ ptr++;
}
return records;
@@ -356,12 +367,20 @@ public:
}
static std::vector<R> merge(std::vector<std::vector<R>> &results, void *parms) {
+ size_t total = 0;
+ for (size_t i=0; i<results.size(); i++) {
+ total += results[i].size();
+ }
+
+ if (total == 0) {
+ return std::vector<R>();
+ }
+
std::vector<R> output;
+ output.reserve(total);
for (size_t i=0; i<results.size(); i++) {
- for (size_t j=0; j<results[i].size(); j++) {
- output.emplace_back(results[i][j]);
- }
+ std::move(results[i].begin(), results[i].end(), std::back_inserter(output));
}
return output;