19 #include "../Catalog/Catalog.h"
22 namespace Fragmenter_Namespace {
26 std::vector<T> new_buffer;
27 new_buffer.reserve(indexes.size());
28 for (
const auto i : indexes) {
29 new_buffer.push_back(buffer[
i]);
31 std::memcpy(buffer, new_buffer.data(), indexes.size() *
sizeof(
T));
36 std::vector<T> new_buffer;
37 new_buffer.reserve(indexes.size());
38 for (
const auto i : indexes) {
39 new_buffer.push_back(buffer[
i]);
41 buffer.swap(new_buffer);
45 const std::vector<size_t>& indexes,
48 switch (ti.get_type()) {
78 switch (ti.get_size()) {
112 template <
typename T>
115 std::sort(indexes.begin(), indexes.end(), [&](
const auto a,
const auto b) {
116 return buffer[a] < buffer[b];
121 const std::vector<std::string>& buffer) {
122 std::sort(indexes.begin(), indexes.end(), [&](
const auto a,
const auto b) {
123 return buffer[a].size() < buffer[b].size() ||
124 (buffer[a].size() == buffer[b].size() && buffer[a] < buffer[b]);
129 const std::vector<ArrayDatum>& buffer) {
130 std::sort(indexes.begin(), indexes.end(), [&](
const auto a,
const auto b) {
131 return buffer[a].is_null || buffer[a].length < buffer[b].length ||
132 (!buffer[b].is_null && buffer[a].length == buffer[b].length &&
133 memcmp(buffer[a].pointer, buffer[b].pointer, buffer[a].length) < 0);
138 std::vector<size_t>& indexes,
141 switch (ti.get_type()) {
168 if (ti.is_varlen()) {
171 switch (ti.get_size()) {
195 CHECK(
false) <<
"invalid type '" << ti.get_type() <<
"' to sort";
203 CHECK_GT(table_desc->sortedColumnId, 0);
204 const auto logical_cd =
209 table_desc->sortedColumnId + (logical_cd->columnType.is_geometry() ? 1 : 0));
210 const auto it = std::find(insertDataStruct.
columnIds.begin(),
212 physical_cd->columnId);
215 const auto dist = std::distance(insertDataStruct.
columnIds.begin(), it);
217 std::vector<size_t> indexes(insertDataStruct.
numRows);
218 std::iota(indexes.begin(), indexes.end(), 0);
219 CHECK_LT(static_cast<size_t>(dist), insertDataStruct.
data.size());
222 for (
size_t i = 0;
i < insertDataStruct.
columnIds.size(); ++
i) {
Catalog_Namespace::Catalog * catalog_
std::vector< std::string > * stringsPtr
std::vector< ArrayDatum > * arraysPtr
DEVICE void sort(ARGS &&...args)
std::vector< bool > is_default
void sortIndexesImpl(std::vector< size_t > &indexes, const T *buffer)
void shuffleByIndexes(const ColumnDescriptor *cd, const std::vector< size_t > &indexes, DataBlockPtr &data)
const int physicalTableId_
virtual void sortData(InsertData &insertDataStruct)
size_t numRows
a vector of column ids for the row(s) being inserted
const ColumnDescriptor * getMetadataForColumn(int tableId, const std::string &colName) const
specifies the content in-memory of a row in the column metadata table
void sortIndexes(const ColumnDescriptor *cd, std::vector< size_t > &indexes, const DataBlockPtr &data)
std::vector< DataBlockPtr > data
the number of rows being inserted
DEVICE void iota(ARGS &&...args)
The data to be inserted using the fragment manager.
const TableDescriptor * getMetadataForTable(const std::string &tableName, const bool populateFragmenter=true) const
Returns a pointer to a const TableDescriptor struct matching the provided tableName.
std::vector< int > columnIds
identifies the table into which the data is being inserted
void shuffleByIndexesImpl(const std::vector< size_t > &indexes, T *buffer)