OmniSciDB  c1a53651b2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TargetValueConvertersImpl.h
Go to the documentation of this file.
1 /*
2  * Copyright 2022 HEAVY.AI, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef TARGET_VALUE_CONVERTERS_IMPL_H_
18 #define TARGET_VALUE_CONVERTERS_IMPL_H_
19 
21 #include "Geospatial/Compression.h"
23 #include "Shared/checked_alloc.h"
26 
27 #include <atomic>
28 #include <future>
29 #include <thread>
30 
31 template <typename T>
33  if (std::is_floating_point<T>::value) {
34  return static_cast<T>(inline_fp_null_array_value<T>());
35  } else {
36  return static_cast<T>(inline_int_null_array_value<T>());
37  }
38 }
39 
40 template <typename SOURCE_TYPE, typename RETURN_TYPE, typename CHECKED_CAST_TYPE>
41 RETURN_TYPE checked_cast(SOURCE_TYPE val, bool check_null, RETURN_TYPE null_value) {
42  if (!std::is_same<SOURCE_TYPE, CHECKED_CAST_TYPE>::value) {
43  // do an overflow check
44  try {
45  CHECKED_CAST_TYPE castedVal = boost::numeric_cast<CHECKED_CAST_TYPE>(val);
46  if (check_null && castedVal == null_value) {
47  throw std::runtime_error("Overflow or underflow");
48  }
49  } catch (...) {
50  throw std::runtime_error("Overflow or underflow");
51  }
52  }
53 
54  return static_cast<RETURN_TYPE>(val);
55 }
56 
57 template <typename SOURCE_TYPE, typename TARGET_TYPE>
59  using ColumnDataPtr = std::unique_ptr<TARGET_TYPE, CheckedMallocDeleter<TARGET_TYPE>>;
61  using CasterFunc = std::function<TARGET_TYPE(SOURCE_TYPE, bool, TARGET_TYPE)>;
62 
64  TARGET_TYPE null_value_;
65  SOURCE_TYPE null_check_value_;
69 
71 
73  size_t num_rows,
74  TARGET_TYPE nullValue,
75  SOURCE_TYPE nullCheckValue,
76  bool doNullCheck)
78  , null_value_(nullValue)
79  , null_check_value_(nullCheckValue)
80  , do_null_check_(doNullCheck) {
81  fixed_array_null_value_ = get_fixed_array_null_value<TARGET_TYPE>();
82  if (num_rows) {
83  allocateColumnarData(num_rows);
84  }
85  }
86 
87  ~NumericValueConverter() override {}
88 
89  void setValueCaster(CasterFunc caster) { checked_caster_ = caster; }
90 
91  void populateFixedArrayNullSentinel(size_t num_rows) {
92  allocateColumnarData(num_rows);
95  }
96 
97  void allocateColumnarData(size_t num_rows) override {
98  CHECK(num_rows > 0);
100  reinterpret_cast<TARGET_TYPE*>(checked_malloc(num_rows * sizeof(TARGET_TYPE))));
101  }
102 
104  CHECK(num_rows > 0);
106  reinterpret_cast<TARGET_TYPE*>(checked_malloc(num_rows * sizeof(TARGET_TYPE))));
107  }
108 
110  size_t row,
111  typename ElementsBufferColumnPtr::pointer columnData,
112  const ScalarTargetValue* scalarValue) {
113  auto db_p = checked_get<SOURCE_TYPE>(row, scalarValue, SOURCE_TYPE_ACCESSOR);
114  auto val = *db_p;
115 
116  if (do_null_check_ && null_check_value_ == val) {
117  columnData[row] = null_value_;
118  } else {
119  if (checked_caster_) {
120  columnData[row] = checked_caster_(val, do_null_check_, null_value_);
121  } else {
122  columnData[row] = static_cast<TARGET_TYPE>(val);
123  }
124  }
125  }
126 
127  void convertToColumnarFormat(size_t row, const ScalarTargetValue* scalarValue) {
128  convertElementToColumnarFormat(row, column_data_.get(), scalarValue);
129  }
130 
131  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
132  auto scalarValue =
133  checked_get<ScalarTargetValue>(row, value, SCALAR_TARGET_VALUE_ACCESSOR);
134  convertToColumnarFormat(row, scalarValue);
135  }
136 
138  std::unique_ptr<std::vector<std::pair<size_t, ElementsBufferColumnPtr>>>&
139  array_buffer,
140  std::unique_ptr<std::vector<ArrayDatum>>::pointer arrayData) {
141  for (size_t row = 0; row < array_buffer->size(); row++) {
142  auto& element = (array_buffer->at(row));
143  bool is_null = false;
144  if (element.second) {
145  ColumnDataPtr& data = element.second;
146  int8_t* arrayDataPtr = reinterpret_cast<int8_t*>(data.release());
147  (*arrayData)[row] =
148  ArrayDatum(element.first * sizeof(TARGET_TYPE), arrayDataPtr, is_null);
149  }
150  }
151  }
152 
154  DataBlockPtr dataBlock;
155  dataBlock.numbersPtr = reinterpret_cast<int8_t*>(column_data_.get());
156  insertData.data.push_back(dataBlock);
157  insertData.columnIds.push_back(column_descriptor_->columnId);
158  }
159 };
160 
161 template <typename TARGET_TYPE>
162 struct DictionaryValueConverter : public NumericValueConverter<int64_t, TARGET_TYPE> {
163  using ElementsDataColumnPtr =
165 
166  using ElementsBufferColumnPtr = std::unique_ptr<std::vector<int32_t>>;
167 
169 
172 
174 
175  const int32_t buffer_null_sentinal_ = std::numeric_limits<int32_t>::min();
176 
178 
179  std::unordered_map<int32_t, int32_t> literals_lookup_;
181 
183  const ColumnDescriptor* targetDescriptor,
184  const Catalog_Namespace::Catalog& target_cat,
185  size_t num_rows,
186  TARGET_TYPE nullValue,
187  int64_t nullCheckValue,
188  bool doNullCheck,
189  StringDictionaryProxy* literals_dict,
190  StringDictionaryProxy* source_dict_proxy)
191  : NumericValueConverter<int64_t, TARGET_TYPE>(targetDescriptor,
192  num_rows,
193  nullValue,
194  nullCheckValue,
195  doNullCheck) {
196  literals_dict_ = literals_dict;
197  const auto& target_dict_key = targetDescriptor->columnType.getStringDictKey();
198  CHECK_EQ(target_dict_key.db_id, target_cat.getDatabaseId());
199  target_dict_desc_ = target_cat.getMetadataForDict(target_dict_key.dict_id, true);
200 
201  source_dict_desc_ = nullptr;
202  source_dict_proxy_ = source_dict_proxy;
203 
204  use_literals_ = 0 == source_dict_key.dict_id;
205  if (!use_literals_) {
206  const auto source_cat =
208  CHECK(source_cat);
210  source_cat->getMetadataForDict(std::abs(source_dict_key.dict_id), true);
212  } else {
213  if (literals_dict) {
214  auto const& transient_vecmap = literals_dict->getTransientVector();
215  for (unsigned index = 0; index < transient_vecmap.size(); ++index) {
216  auto const old_id = StringDictionaryProxy::transientIndexToId(index);
217  std::string const& str = *transient_vecmap[index];
218  auto const new_id = target_dict_desc_->stringDict->getOrAdd(str);
219  literals_lookup_[old_id] = new_id;
220  }
221  }
222 
224  }
225 
226  CHECK(target_dict_desc_);
227 
228  if (num_rows) {
230  }
231  }
232 
234 
236  CHECK(num_rows > 0);
237  return std::make_unique<std::vector<int32_t>>(num_rows);
238  }
239 
241  size_t row,
242  typename ElementsBufferColumnPtr::pointer columnBuffer,
243  const ScalarTargetValue* scalarValue) {
244  auto db_p = checked_get<int64_t>(row, scalarValue, this->SOURCE_TYPE_ACCESSOR);
245  auto val = *db_p;
246 
247  if (this->do_null_check_ && this->null_check_value_ == val) {
248  (*columnBuffer)[row] = this->buffer_null_sentinal_;
249  } else {
250  (*columnBuffer)[row] = (int32_t)val;
251  }
252  }
253 
254  void convertToColumnarFormat(size_t row, const ScalarTargetValue* scalarValue) {
255  convertElementToColumnarFormat(row, this->column_buffer_.get(), scalarValue);
256  }
257 
258  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
259  auto scalarValue =
260  checked_get<ScalarTargetValue>(row, value, this->SCALAR_TARGET_VALUE_ACCESSOR);
261 
262  convertToColumnarFormat(row, scalarValue);
263  }
264 
265  inline int32_t convertTransientStringIdToPermanentId(int32_t& transient_string_id) {
266  if (source_dict_proxy_) {
267  auto str = source_dict_proxy_->getString(transient_string_id);
268  return source_dict_proxy_->getOrAdd(str);
269  } else {
270  throw std::runtime_error("Unexpected negative source ID");
271  }
272  }
273 
275  ElementsBufferColumnPtr buffer) {
278  reinterpret_cast<TARGET_TYPE*>(
279  checked_malloc(buffer->size() * sizeof(TARGET_TYPE))));
280 
281  std::vector<int32_t>* bufferPtr =
282  reinterpret_cast<std::vector<int32_t>*>(buffer.get());
283  TARGET_TYPE* columnDataPtr = reinterpret_cast<TARGET_TYPE*>(data.get());
284  if (use_literals_) {
285  for (size_t i = 0; i < bufferPtr->size(); i++) {
286  auto id = literals_lookup_[(*bufferPtr)[i]];
287  if (id == buffer_null_sentinal_) {
288  columnDataPtr[i] = this->null_value_;
289  } else {
290  columnDataPtr[i] = static_cast<TARGET_TYPE>(id);
291  }
292  }
293  } else {
295  // special case, where source and target dict are the same
296  // mostly in update
297  for (size_t i = 0; i < bufferPtr->size(); i++) {
298  auto src_id = (*bufferPtr)[i];
299  if (src_id == buffer_null_sentinal_) {
300  columnDataPtr[i] = this->null_value_;
301  } else if (src_id < 0) {
302  columnDataPtr[i] = convertTransientStringIdToPermanentId(src_id);
303  } else {
304  columnDataPtr[i] = static_cast<TARGET_TYPE>(src_id);
305  }
306  }
307 
308  } else {
309  std::vector<int32_t> dest_ids;
310  dest_ids.resize(bufferPtr->size());
311 
312  if (source_dict_proxy_) {
315  *bufferPtr,
318  } else {
321  *bufferPtr,
323  }
324 
325  // fixup NULL sentinel
326  for (size_t i = 0; i < dest_ids.size(); i++) {
327  auto id = dest_ids[i];
328  if (id == buffer_null_sentinal_) {
329  columnDataPtr[i] = this->null_value_;
330  } else {
331  if (std::is_signed<TARGET_TYPE>::value) {
332  if (id < 0) {
333  throw std::runtime_error(
334  "Maximum number of unique strings (" +
335  std::to_string(std::numeric_limits<TARGET_TYPE>::max()) +
336  ") reached in target dictionary");
337  }
338  } else {
339  if (id >= std::numeric_limits<TARGET_TYPE>::max()) {
340  throw std::runtime_error(
341  "Maximum number of unique strings (" +
342  std::to_string(std::numeric_limits<TARGET_TYPE>::max()) +
343  ") reached in target column's dict encoding");
344  }
345  }
346  columnDataPtr[i] = static_cast<TARGET_TYPE>(id);
347  }
348  }
349  }
350  }
351 
352  return data;
353  }
354 
356  std::unique_ptr<std::vector<std::pair<size_t, ElementsBufferColumnPtr>>>&
357  array_buffer,
358  std::unique_ptr<std::vector<ArrayDatum>>::pointer arrayData) {
359  if (use_literals_) {
360  for (size_t row = 0; row < array_buffer->size(); row++) {
361  auto& element = (array_buffer->at(row));
362  bool is_null = false;
363  if (element.second) {
365  processBuffer(std::move(element.second));
366  int8_t* arrayDataPtr = reinterpret_cast<int8_t*>(data.release());
367  (*arrayData)[row] =
368  ArrayDatum(element.first * sizeof(TARGET_TYPE), arrayDataPtr, is_null);
369  }
370  }
371  } else {
372  std::vector<std::vector<int32_t>> srcArrayIds(array_buffer->size());
373  std::vector<std::vector<int32_t>> destArrayIds(0);
374 
375  for (size_t row = 0; row < array_buffer->size(); row++) {
376  auto& element = (array_buffer->at(row));
377  if (element.second) {
378  srcArrayIds[row] = *(element.second.get());
379  }
380  }
381 
384  srcArrayIds,
386 
387  for (size_t row = 0; row < array_buffer->size(); row++) {
388  auto& element = (array_buffer->at(row));
389  bool is_null = false;
390  if (element.second) {
391  *(element.second.get()) = destArrayIds[row];
392  int8_t* arrayDataPtr = reinterpret_cast<int8_t*>(&(element.second->at(0)));
393  (*arrayData)[row] = ArrayDatum(element.first * sizeof(TARGET_TYPE),
394  arrayDataPtr,
395  is_null,
396  DoNothingDeleter());
397  }
398  }
399  }
400  }
401 
403  if (column_buffer_) {
404  this->column_data_ = processBuffer(std::move(column_buffer_));
405  column_buffer_ = nullptr;
406  }
407  }
408 
411  DataBlockPtr dataBlock;
412  dataBlock.numbersPtr = reinterpret_cast<int8_t*>(this->column_data_.get());
413  insertData.data.push_back(dataBlock);
414  insertData.columnIds.push_back(this->column_descriptor_->columnId);
415  }
416 };
417 
419  std::unique_ptr<std::vector<std::string>> column_data_;
420 
422 
426 
428  size_t num_rows,
429  bool dictEncoded,
430  const shared::StringDictKey& source_dict_key,
431  StringDictionaryProxy* literals_dict)
432  : TargetValueConverter(cd) {
433  source_dict_ = nullptr;
434  literals_source_dict_ = nullptr;
435  dict_encoded_ = dictEncoded;
436  if (dictEncoded) {
437  if (0 != source_dict_key.dict_id) {
438  const auto source_cat =
440  CHECK(source_cat);
441  const auto source_dict_desc =
442  source_cat->getMetadataForDict(std::abs(source_dict_key.dict_id), true);
443  CHECK(source_dict_desc);
444  source_dict_ = source_dict_desc->stringDict.get();
446  } else {
447  literals_source_dict_ = literals_dict;
448  }
449  }
450  if (num_rows) {
451  allocateColumnarData(num_rows);
452  }
453  }
454 
455  ~StringValueConverter() override {}
456 
457  void allocateColumnarData(size_t num_rows) override {
458  CHECK(num_rows > 0);
459  column_data_ = std::make_unique<std::vector<std::string>>(num_rows);
460  }
461 
462  void convertToColumnarFormatFromDict(size_t row, const TargetValue* value) {
463  auto scalarValue =
464  checked_get<ScalarTargetValue>(row, value, SCALAR_TARGET_VALUE_ACCESSOR);
465  auto db_p = checked_get<int64_t>(row, scalarValue, this->SOURCE_TYPE_ACCESSOR);
466  auto val = *db_p;
467 
468  if (std::numeric_limits<int32_t>::min() == val) {
469  (*column_data_)[row] = std::string("");
470  } else {
471  if (source_dict_) {
472  std::string strVal = source_dict_->getString(val);
473  (*column_data_)[row] = strVal;
474  } else if (literals_source_dict_) {
475  std::string strVal = literals_source_dict_->getString(val);
476  (*column_data_)[row] = strVal;
477  } else {
478  CHECK_EQ(val, inline_int_null_value<int32_t>());
479  std::string nullStr = "";
480  (*column_data_)[row] = nullStr;
481  }
482  }
483  }
484 
485  void convertToColumnarFormatFromString(size_t row, const TargetValue* value) {
486  auto scalarValue =
487  checked_get<ScalarTargetValue>(row, value, SCALAR_TARGET_VALUE_ACCESSOR);
488  auto db_p = checked_get<NullableString>(row, scalarValue, NULLABLE_STRING_ACCESSOR);
489  const auto db_str_p = checked_get<std::string>(row, db_p, STRING_ACCESSOR);
490 
491  if (nullptr != db_str_p) {
492  (*column_data_)[row] = *db_str_p;
493  } else {
494  (*column_data_)[row] = std::string("");
495  }
496  }
497 
498  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
499  if (dict_encoded_) {
501  } else {
503  }
504  }
505 
507  DataBlockPtr dataBlock;
508  dataBlock.stringsPtr = column_data_.get();
509  insertData.data.push_back(dataBlock);
510  insertData.columnIds.push_back(column_descriptor_->columnId);
511  }
512 };
513 
514 template <typename ELEMENT_CONVERTER>
516  std::unique_ptr<
517  std::vector<std::pair<size_t, typename ELEMENT_CONVERTER::ElementsBufferColumnPtr>>>
519  std::unique_ptr<std::vector<ArrayDatum>> column_data_;
520  std::unique_ptr<ELEMENT_CONVERTER> element_converter_;
523  bool data_finalized_ = false;
527 
529 
531  size_t num_rows,
532  std::unique_ptr<ELEMENT_CONVERTER> element_converter,
533  bool do_check_null)
535  , element_converter_(std::move(element_converter))
536  , element_type_info_(cd->columnType.get_elem_type())
537  , do_check_null_(do_check_null) {
538  if (num_rows) {
539  allocateColumnarData(num_rows);
540  }
541 
542  if (cd->columnType.get_size() > 0) {
545  fixed_array_size_ / sizeof(ELEMENT_CONVERTER::fixed_array_null_value_);
546  element_converter_->populateFixedArrayNullSentinel(fixed_array_elements_count_);
548  reinterpret_cast<int8_t*>(element_converter_->column_data_.get());
549  } else {
550  fixed_array_size_ = 0;
552  fixed_array_null_sentinel_ = nullptr;
553  }
554  }
555 
556  ~ArrayValueConverter() override {}
557 
558  void allocateColumnarData(size_t num_rows) override {
559  CHECK(num_rows > 0);
560  column_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
561  column_buffer_ = std::make_unique<std::vector<
562  std::pair<size_t, typename ELEMENT_CONVERTER::ElementsBufferColumnPtr>>>(
563  num_rows);
564  }
565 
566  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
567  const auto arrayValue =
568  checked_get<ArrayTargetValue>(row, value, ARRAY_VALUE_ACCESSOR);
569  CHECK(arrayValue);
570  if (arrayValue->is_initialized()) {
571  const auto& vec = arrayValue->get();
572  bool is_null = false;
573 
575  if (fixed_array_elements_count_ != vec.size()) {
576  throw std::runtime_error(
577  "Incorrect number of array elements for fixed length array column");
578  }
579  }
580 
581  if (vec.size()) {
582  typename ELEMENT_CONVERTER::ElementsBufferColumnPtr elementBuffer =
583  element_converter_->allocateColumnarBuffer(vec.size());
584 
585  int elementIndex = 0;
586  for (const auto& scalarValue : vec) {
587  element_converter_->convertElementToColumnarFormat(
588  elementIndex++, elementBuffer.get(), &scalarValue);
589  }
590 
591  column_buffer_->at(row) = {vec.size(), std::move(elementBuffer)};
592 
593  } else {
594  // Empty, not NULL
595  (*column_data_)[row] = ArrayDatum(0, nullptr, is_null, DoNothingDeleter());
596  }
597  } else {
598  if (!do_check_null_) {
599  throw std::runtime_error("NULL assignment of non null column not allowed");
600  }
601 
602  bool is_null = true; // do_check_null_;
603  (*column_data_)[row] = ArrayDatum(
605  (*column_data_)[row].is_null = is_null;
606  }
607  }
608 
610  if (!data_finalized_) {
611  element_converter_->processArrayBuffer(column_buffer_, column_data_.get());
612  data_finalized_ = true;
613  }
614  }
615 
618  DataBlockPtr dataBlock;
619  dataBlock.arraysPtr = column_data_.get();
620  insertData.data.push_back(dataBlock);
621  insertData.columnIds.push_back(column_descriptor_->columnId);
622  }
623 };
624 
627 
628  std::unique_ptr<std::vector<std::string>> column_data_;
629  std::unique_ptr<std::vector<ArrayDatum>> signed_compressed_coords_data_;
630 
632  size_t num_rows,
633  const ColumnDescriptor* logicalColumnDescriptor)
634  : TargetValueConverter(logicalColumnDescriptor) {
638 
639  if (num_rows) {
640  allocateColumnarData(num_rows);
641  }
642  }
643 
645 
646  void allocateColumnarData(size_t num_rows) override {
647  CHECK(num_rows > 0);
648  column_data_ = std::make_unique<std::vector<std::string>>(num_rows);
649  signed_compressed_coords_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
650  }
651 
654 
656  const std::shared_ptr<std::vector<double>>& coords) {
657  const auto compressed_coords_vector =
659 
660  uint8_t* compressed_coords_array = reinterpret_cast<uint8_t*>(
661  checked_malloc(sizeof(uint8_t) * compressed_coords_vector.size()));
662  memcpy(compressed_coords_array,
663  &compressed_coords_vector[0],
664  compressed_coords_vector.size());
665 
666  return ArrayDatum((int)compressed_coords_vector.size(),
667  reinterpret_cast<int8_t*>(compressed_coords_array),
668  false);
669  }
670 
671  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
672  const auto geoValue = checked_get<GeoTargetValue>(row, value, GEO_VALUE_ACCESSOR);
673  CHECK(geoValue);
674  if (geoValue->is_initialized()) {
675  const auto geo = geoValue->get();
676  const auto geoPoint =
677  checked_get<GeoPointTargetValue>(row, &geo, GEO_POINT_VALUE_ACCESSOR);
678  CHECK(geoPoint);
679  (*column_data_)[row] = "";
680  (*signed_compressed_coords_data_)[row] = toCompressedCoords(geoPoint->coords);
681  } else {
682  // NULL point
683  (*column_data_)[row] = "";
684  auto coords = std::make_shared<std::vector<double>>();
685  coords->push_back(NULL_ARRAY_DOUBLE);
686  coords->push_back(NULL_DOUBLE);
687  auto coords_datum = toCompressedCoords(coords);
688  coords_datum.is_null = true;
689  (*signed_compressed_coords_data_)[row] = coords_datum;
690  }
691  }
692 
694  DataBlockPtr logical, coords;
695 
696  logical.stringsPtr = column_data_.get();
698 
699  insertData.data.emplace_back(logical);
700  insertData.columnIds.emplace_back(column_descriptor_->columnId);
701 
702  insertData.data.emplace_back(coords);
703  insertData.columnIds.emplace_back(coords_column_descriptor_->columnId);
704  }
705 };
706 
707 inline std::vector<double> compute_bounds_of_coords(
708  const std::shared_ptr<std::vector<double>>& coords) {
709  std::vector<double> bounds(4);
710  constexpr auto DOUBLE_MAX = std::numeric_limits<double>::max();
711  constexpr auto DOUBLE_MIN = std::numeric_limits<double>::lowest();
712  bounds[0] = DOUBLE_MAX;
713  bounds[1] = DOUBLE_MAX;
714  bounds[2] = DOUBLE_MIN;
715  bounds[3] = DOUBLE_MIN;
716  auto size_coords = coords->size();
717 
718  for (size_t i = 0; i < size_coords; i += 2) {
719  double x = (*coords)[i];
720  double y = (*coords)[i + 1];
721 
722  bounds[0] = std::min(bounds[0], x);
723  bounds[1] = std::min(bounds[1], y);
724  bounds[2] = std::max(bounds[2], x);
725  bounds[3] = std::max(bounds[3], y);
726  }
727  return bounds;
728 }
729 
730 template <typename ELEM_TYPE>
731 inline ArrayDatum to_array_datum(const std::vector<ELEM_TYPE>& vector) {
732  ELEM_TYPE* array =
733  reinterpret_cast<ELEM_TYPE*>(checked_malloc(sizeof(ELEM_TYPE) * vector.size()));
734  memcpy(array, vector.data(), vector.size() * sizeof(ELEM_TYPE));
735 
736  return ArrayDatum(
737  (int)(vector.size() * sizeof(ELEM_TYPE)), reinterpret_cast<int8_t*>(array), false);
738 }
739 
740 template <typename ELEM_TYPE>
741 inline ArrayDatum to_array_datum(const std::shared_ptr<std::vector<ELEM_TYPE>>& vector) {
742  return to_array_datum(*vector.get());
743 }
744 
747 
748  std::unique_ptr<std::vector<ArrayDatum>> bounds_data_;
749 
751  size_t num_rows,
752  const ColumnDescriptor* logicalColumnDescriptor)
753  : GeoPointValueConverter(cat, num_rows, logicalColumnDescriptor) {
757 
758  if (num_rows) {
759  allocateColumnarData(num_rows);
760  }
761  }
762 
764 
765  void allocateColumnarData(size_t num_rows) override {
766  CHECK(num_rows > 0);
768  bounds_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
769  }
770 
772 
773  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
774  const auto geoValue =
775  checked_get<GeoTargetValue>(row, value, GEO_TARGET_VALUE_ACCESSOR);
776  CHECK(geoValue);
777  if (geoValue->is_initialized()) {
778  const auto geo = geoValue->get();
779  const auto geoMultiPoint =
780  checked_get<GeoMultiPointTargetValue>(row, &geo, GEO_MULTIPOINT_VALUE_ACCESSOR);
781 
782  (*column_data_)[row] = "";
783  (*signed_compressed_coords_data_)[row] = toCompressedCoords(geoMultiPoint->coords);
784  auto bounds = compute_bounds_of_coords(geoMultiPoint->coords);
785  (*bounds_data_)[row] = to_array_datum(bounds);
786  } else {
787  // NULL MultiPoint
788  (*column_data_)[row] = "";
789  (*signed_compressed_coords_data_)[row] = ArrayDatum(0, nullptr, true);
790  std::vector<double> bounds = {
791  NULL_ARRAY_DOUBLE, NULL_DOUBLE, NULL_DOUBLE, NULL_DOUBLE};
792  auto bounds_datum = to_array_datum(bounds);
793  bounds_datum.is_null = true;
794  (*bounds_data_)[row] = bounds_datum;
795  }
796  }
797 
800 
801  DataBlockPtr bounds;
802 
803  bounds.arraysPtr = bounds_data_.get();
804 
805  insertData.data.emplace_back(bounds);
806  insertData.columnIds.emplace_back(bounds_column_descriptor_->columnId);
807  }
808 };
809 
812 
813  std::unique_ptr<std::vector<ArrayDatum>> bounds_data_;
814 
816  size_t num_rows,
817  const ColumnDescriptor* logicalColumnDescriptor)
818  : GeoPointValueConverter(cat, num_rows, logicalColumnDescriptor) {
822 
823  if (num_rows) {
824  allocateColumnarData(num_rows);
825  }
826  }
827 
829 
830  void allocateColumnarData(size_t num_rows) override {
831  CHECK(num_rows > 0);
833  bounds_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
834  }
835 
837 
838  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
839  const auto geoValue =
840  checked_get<GeoTargetValue>(row, value, GEO_TARGET_VALUE_ACCESSOR);
841  CHECK(geoValue);
842  if (geoValue->is_initialized()) {
843  const auto geo = geoValue->get();
844  const auto geoLinestring =
845  checked_get<GeoLineStringTargetValue>(row, &geo, GEO_LINESTRING_VALUE_ACCESSOR);
846 
847  (*column_data_)[row] = "";
848  (*signed_compressed_coords_data_)[row] = toCompressedCoords(geoLinestring->coords);
849  auto bounds = compute_bounds_of_coords(geoLinestring->coords);
850  (*bounds_data_)[row] = to_array_datum(bounds);
851  } else {
852  // NULL Linestring
853  (*column_data_)[row] = "";
854  (*signed_compressed_coords_data_)[row] = ArrayDatum(0, nullptr, true);
855  std::vector<double> bounds = {
856  NULL_ARRAY_DOUBLE, NULL_DOUBLE, NULL_DOUBLE, NULL_DOUBLE};
857  auto bounds_datum = to_array_datum(bounds);
858  bounds_datum.is_null = true;
859  (*bounds_data_)[row] = bounds_datum;
860  }
861  }
862 
865 
866  DataBlockPtr bounds;
867 
868  bounds.arraysPtr = bounds_data_.get();
869 
870  insertData.data.emplace_back(bounds);
871  insertData.columnIds.emplace_back(bounds_column_descriptor_->columnId);
872  }
873 };
874 
878 
879  std::unique_ptr<std::vector<ArrayDatum>> linestring_sizes_data_;
880  std::unique_ptr<std::vector<ArrayDatum>> bounds_data_;
881 
883  size_t num_rows,
884  const ColumnDescriptor* logicalColumnDescriptor)
885  : GeoPointValueConverter(cat, num_rows, logicalColumnDescriptor) {
892 
893  if (num_rows) {
894  allocateColumnarData(num_rows);
895  }
896  }
897 
899 
900  void allocateColumnarData(size_t num_rows) override {
901  CHECK(num_rows > 0);
903  linestring_sizes_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
904  bounds_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
905  }
906 
909 
910  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
911  const auto geoValue =
912  checked_get<GeoTargetValue>(row, value, GEO_TARGET_VALUE_ACCESSOR);
913  CHECK(geoValue);
914  if (geoValue->is_initialized()) {
915  const auto geo = geoValue->get();
916  const auto geoMultiLinestring = checked_get<GeoMultiLineStringTargetValue>(
918 
919  (*column_data_)[row] = "";
920  (*signed_compressed_coords_data_)[row] =
921  toCompressedCoords(geoMultiLinestring->coords);
922  (*linestring_sizes_data_)[row] =
923  to_array_datum(geoMultiLinestring->linestring_sizes);
924  auto bounds = compute_bounds_of_coords(geoMultiLinestring->coords);
925  (*bounds_data_)[row] = to_array_datum(bounds);
926  } else {
927  // NULL MultiLinestring
928  (*column_data_)[row] = "";
929  (*signed_compressed_coords_data_)[row] = ArrayDatum(0, nullptr, true);
930  (*linestring_sizes_data_)[row] = ArrayDatum(0, nullptr, true);
931  std::vector<double> bounds = {
932  NULL_ARRAY_DOUBLE, NULL_DOUBLE, NULL_DOUBLE, NULL_DOUBLE};
933  auto bounds_datum = to_array_datum(bounds);
934  bounds_datum.is_null = true;
935  (*bounds_data_)[row] = bounds_datum;
936  }
937  }
938 
941 
942  DataBlockPtr linestringSizes, bounds;
943 
944  linestringSizes.arraysPtr = linestring_sizes_data_.get();
945  bounds.arraysPtr = bounds_data_.get();
946 
947  insertData.data.emplace_back(linestringSizes);
948  insertData.columnIds.emplace_back(linestring_sizes_column_descriptor_->columnId);
949 
950  insertData.data.emplace_back(bounds);
951  insertData.columnIds.emplace_back(bounds_column_descriptor_->columnId);
952  }
953 };
954 
956  protected:
958  const int column_id)
959  : render_group_analyzer_{nullptr} {
960  if (render_group_analyzer_map) {
961  // NOTE: this is not thread safe
962  auto itr = render_group_analyzer_map->try_emplace(column_id).first;
963  render_group_analyzer_ = &itr->second;
964  }
965  }
966 
968 };
969 
975 
976  std::unique_ptr<std::vector<ArrayDatum>> ring_sizes_data_;
977  std::unique_ptr<std::vector<ArrayDatum>> bounds_data_;
978  std::unique_ptr<int32_t[]> render_group_data_;
979 
981  size_t num_rows,
982  const ColumnDescriptor* logicalColumnDescriptor,
983  RenderGroupAnalyzerMap* render_group_analyzer_map)
984  : GeoPointValueConverter(cat, num_rows, logicalColumnDescriptor)
985  , GeoPolygonRenderGroupManager(render_group_analyzer_map,
986  logicalColumnDescriptor->columnId) {
996 
997  if (num_rows) {
998  allocateColumnarData(num_rows);
999  }
1000  }
1001 
1003 
1004  void allocateColumnarData(size_t num_rows) override {
1006  ring_sizes_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
1007  bounds_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
1008  render_group_data_ = std::make_unique<int32_t[]>(num_rows);
1009  }
1010 
1012 
1013  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
1014  const auto geoValue =
1015  checked_get<GeoTargetValue>(row, value, GEO_TARGET_VALUE_ACCESSOR);
1016  CHECK(geoValue);
1017  if (geoValue->is_initialized()) {
1018  const auto geo = geoValue->get();
1019  const auto geoPoly =
1020  checked_get<GeoPolyTargetValue>(row, &geo, GEO_POLY_VALUE_ACCESSOR);
1021 
1022  (*column_data_)[row] = "";
1023  (*signed_compressed_coords_data_)[row] = toCompressedCoords(geoPoly->coords);
1024  (*ring_sizes_data_)[row] = to_array_datum(geoPoly->ring_sizes);
1025  auto bounds = compute_bounds_of_coords(geoPoly->coords);
1026  (*bounds_data_)[row] = to_array_datum(bounds);
1027  if (render_group_analyzer_) {
1028  render_group_data_[row] =
1030  } else {
1031  render_group_data_[row] = 0;
1032  }
1033  } else {
1034  // NULL Polygon
1035  (*column_data_)[row] = "";
1036  (*signed_compressed_coords_data_)[row] = ArrayDatum(0, nullptr, true);
1037  (*ring_sizes_data_)[row] = ArrayDatum(0, nullptr, true);
1038  std::vector<double> bounds = {
1039  NULL_ARRAY_DOUBLE, NULL_DOUBLE, NULL_DOUBLE, NULL_DOUBLE};
1040  auto bounds_datum = to_array_datum(bounds);
1041  bounds_datum.is_null = true;
1042  (*bounds_data_)[row] = bounds_datum;
1044  }
1045  }
1046 
1049 
1050  DataBlockPtr ringSizes, bounds, renderGroup;
1051 
1052  ringSizes.arraysPtr = ring_sizes_data_.get();
1053  bounds.arraysPtr = bounds_data_.get();
1054  renderGroup.numbersPtr = reinterpret_cast<int8_t*>(render_group_data_.get());
1055 
1056  insertData.data.emplace_back(ringSizes);
1057  insertData.columnIds.emplace_back(ring_sizes_column_descriptor_->columnId);
1058 
1059  insertData.data.emplace_back(bounds);
1060  insertData.columnIds.emplace_back(bounds_column_descriptor_->columnId);
1061 
1062  insertData.data.emplace_back(renderGroup);
1063  insertData.columnIds.emplace_back(render_group_column_descriptor_->columnId);
1064  }
1065 };
1066 
1073 
1074  std::unique_ptr<std::vector<ArrayDatum>> ring_sizes_data_;
1075  std::unique_ptr<std::vector<ArrayDatum>> poly_rings_data_;
1076  std::unique_ptr<std::vector<ArrayDatum>> bounds_data_;
1077  std::unique_ptr<int32_t[]> render_group_data_;
1078 
1080  size_t num_rows,
1081  const ColumnDescriptor* logicalColumnDescriptor,
1082  RenderGroupAnalyzerMap* render_group_analyzer_map)
1083  : GeoPointValueConverter(cat, num_rows, logicalColumnDescriptor)
1084  , GeoPolygonRenderGroupManager(render_group_analyzer_map,
1085  logicalColumnDescriptor->columnId) {
1098 
1099  if (num_rows) {
1100  allocateColumnarData(num_rows);
1101  }
1102  }
1103 
1105 
1106  void allocateColumnarData(size_t num_rows) override {
1108  ring_sizes_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
1109  poly_rings_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
1110  bounds_data_ = std::make_unique<std::vector<ArrayDatum>>(num_rows);
1111  render_group_data_ = std::make_unique<int32_t[]>(num_rows);
1112  }
1113 
1115 
1116  void convertToColumnarFormat(size_t row, const TargetValue* value) override {
1117  const auto geoValue =
1118  checked_get<GeoTargetValue>(row, value, GEO_TARGET_VALUE_ACCESSOR);
1119  CHECK(geoValue);
1120  if (geoValue->is_initialized()) {
1121  const auto geo = geoValue->get();
1122  const auto geoMultiPoly =
1123  checked_get<GeoMultiPolyTargetValue>(row, &geo, GEO_MULTI_POLY_VALUE_ACCESSOR);
1124 
1125  (*column_data_)[row] = "";
1126  (*signed_compressed_coords_data_)[row] = toCompressedCoords(geoMultiPoly->coords);
1127  (*ring_sizes_data_)[row] = to_array_datum(geoMultiPoly->ring_sizes);
1128  (*poly_rings_data_)[row] = to_array_datum(geoMultiPoly->poly_rings);
1129  auto bounds = compute_bounds_of_coords(geoMultiPoly->coords);
1130  (*bounds_data_)[row] = to_array_datum(bounds);
1131  if (render_group_analyzer_) {
1132  render_group_data_[row] =
1134  } else {
1135  render_group_data_[row] = 0;
1136  }
1137  } else {
1138  // NULL MultiPolygon
1139  (*column_data_)[row] = "";
1140  (*signed_compressed_coords_data_)[row] = ArrayDatum(0, nullptr, true);
1141  (*ring_sizes_data_)[row] = ArrayDatum(0, nullptr, true);
1142  (*poly_rings_data_)[row] = ArrayDatum(0, nullptr, true);
1143  std::vector<double> bounds = {
1144  NULL_ARRAY_DOUBLE, NULL_DOUBLE, NULL_DOUBLE, NULL_DOUBLE};
1145  auto bounds_datum = to_array_datum(bounds);
1146  bounds_datum.is_null = true;
1147  (*bounds_data_)[row] = bounds_datum;
1149  }
1150  }
1151 
1154 
1155  DataBlockPtr ringSizes, polyRings, bounds, renderGroup;
1156 
1157  ringSizes.arraysPtr = ring_sizes_data_.get();
1158  polyRings.arraysPtr = poly_rings_data_.get();
1159  bounds.arraysPtr = bounds_data_.get();
1160  renderGroup.numbersPtr = reinterpret_cast<int8_t*>(render_group_data_.get());
1161 
1162  insertData.data.emplace_back(ringSizes);
1163  insertData.columnIds.emplace_back(ring_sizes_column_descriptor_->columnId);
1164 
1165  insertData.data.emplace_back(polyRings);
1166  insertData.columnIds.emplace_back(ring_sizes_solumn_descriptor_->columnId);
1167 
1168  insertData.data.emplace_back(bounds);
1169  insertData.columnIds.emplace_back(bounds_column_descriptor_->columnId);
1170 
1171  insertData.data.emplace_back(renderGroup);
1172  insertData.columnIds.emplace_back(render_group_column_descriptor_->columnId);
1173  }
1174 };
1175 
1176 #endif
std::unique_ptr< std::vector< ArrayDatum > > ring_sizes_data_
ArrayDatum to_array_datum(const std::vector< ELEM_TYPE > &vector)
std::unique_ptr< std::vector< ArrayDatum > > bounds_data_
std::unique_ptr< TARGET_TYPE, CheckedMallocDeleter< TARGET_TYPE >> ColumnDataPtr
std::unique_ptr< std::vector< int32_t >> ElementsBufferColumnPtr
StringDictionaryProxy * literals_source_dict_
#define CHECK_EQ(x, y)
Definition: Logger.h:301
void convertToColumnarFormatFromDict(size_t row, const TargetValue *value)
void allocateColumnarData(size_t num_rows) override
std::unique_ptr< std::vector< ArrayDatum > > bounds_data_
#define NULL_DOUBLE
HOST DEVICE int get_size() const
Definition: sqltypes.h:393
const std::vector< std::string const * > & getTransientVector() const
std::string cat(Ts &&...args)
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
class for a per-database catalog. also includes metadata for the current database and the current use...
Definition: Catalog.h:132
std::vector< std::string > * stringsPtr
Definition: sqltypes.h:224
const ColumnDescriptor * ring_sizes_solumn_descriptor_
import_export::RenderGroupAnalyzer * render_group_analyzer_
std::vector< ArrayDatum > * arraysPtr
Definition: sqltypes.h:225
std::unique_ptr< int32_t[]> render_group_data_
constexpr auto DOUBLE_MAX
Definition: Types.cpp:40
void allocateColumnarData(size_t num_rows) override
void processArrayBuffer(std::unique_ptr< std::vector< std::pair< size_t, ElementsBufferColumnPtr >>> &array_buffer, std::unique_ptr< std::vector< ArrayDatum >>::pointer arrayData)
boost_variant_accessor< int64_t > SOURCE_TYPE_ACCESSOR
const ColumnDescriptor * bounds_column_descriptor_
ArrayValueConverter(const ColumnDescriptor *cd, size_t num_rows, std::unique_ptr< ELEMENT_CONVERTER > element_converter, bool do_check_null)
void populateFixedArrayNullSentinel(size_t num_rows)
const DictDescriptor * source_dict_desc_
const ColumnDescriptor * bounds_column_descriptor_
const ColumnDescriptor * linestring_sizes_column_descriptor_
void convertToColumnarFormat(size_t row, const TargetValue *value) override
void convertToColumnarFormat(size_t row, const ScalarTargetValue *scalarValue)
void convertToColumnarFormat(size_t row, const TargetValue *value) override
std::unique_ptr< std::vector< ArrayDatum > > bounds_data_
void allocateColumnarData(size_t num_rows) override
const ColumnDescriptor * column_descriptor_
std::string getString(int32_t string_id) const
ArrayDatum toCompressedCoords(const std::shared_ptr< std::vector< double >> &coords)
ElementsBufferColumnPtr column_buffer_
std::vector< double > compute_bounds_of_coords(const std::shared_ptr< std::vector< double >> &coords)
std::unique_ptr< std::vector< ArrayDatum > > poly_rings_data_
static void populate_string_ids(std::vector< int32_t > &dest_ids, StringDictionary *dest_dict, const std::vector< int32_t > &source_ids, const StringDictionary *source_dict, const std::vector< std::string const * > &transient_string_vec={})
Populates provided dest_ids vector with string ids corresponding to given source strings.
void processArrayBuffer(std::unique_ptr< std::vector< std::pair< size_t, ElementsBufferColumnPtr >>> &array_buffer, std::unique_ptr< std::vector< ArrayDatum >>::pointer arrayData)
std::function< TARGET_TYPE(int64_t, bool, TARGET_TYPE)> CasterFunc
const ColumnDescriptor * bounds_column_descriptor_
ElementsBufferColumnPtr allocateColumnarBuffer(size_t num_rows)
void convertElementToColumnarFormat(size_t row, typename ElementsBufferColumnPtr::pointer columnData, const ScalarTargetValue *scalarValue)
std::string to_string(char const *&&v)
const DictDescriptor * target_dict_desc_
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
const StringDictionaryProxy * literals_dict_
#define NULL_INT
void convertToColumnarFormat(size_t row, const ScalarTargetValue *scalarValue)
void allocateColumnarData(size_t num_rows) override
std::shared_ptr< StringDictionary > stringDict
boost_variant_accessor< GeoMultiPointTargetValue > GEO_MULTIPOINT_VALUE_ACCESSOR
boost_variant_accessor< ScalarTargetValue > SCALAR_TARGET_VALUE_ACCESSOR
boost_variant_accessor< GeoLineStringTargetValue > GEO_LINESTRING_VALUE_ACCESSOR
std::conditional_t< is_cuda_compiler(), DeviceArrayDatum, HostArrayDatum > ArrayDatum
Definition: sqltypes.h:219
GeoPointValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor)
std::vector< uint8_t > compress_coords(const std::vector< double > &coords, const SQLTypeInfo &ti)
Definition: Compression.cpp:52
boost_variant_accessor< NullableString > NULLABLE_STRING_ACCESSOR
static SysCatalog & instance()
Definition: SysCatalog.h:343
std::unique_ptr< std::vector< std::string > > column_data_
CONSTEXPR DEVICE bool is_null(const T &value)
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
void convertToColumnarFormatFromString(size_t row, const TargetValue *value)
void * checked_malloc(const size_t size)
Definition: checked_alloc.h:45
boost_variant_accessor< GeoMultiPolyTargetValue > GEO_MULTI_POLY_VALUE_ACCESSOR
const ColumnDescriptor * bounds_column_descriptor_
boost_variant_accessor< GeoPolyTargetValue > GEO_POLY_VALUE_ACCESSOR
boost_variant_accessor< std::string > STRING_ACCESSOR
const ColumnDescriptor * ring_sizes_column_descriptor_
std::unique_ptr< std::vector< ArrayDatum > > ring_sizes_data_
void finalizeDataBlocksForInsertData() override
GeoLinestringValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor)
const ColumnDescriptor * getMetadataForColumn(int tableId, const std::string &colName) const
int getDatabaseId() const
Definition: Catalog.h:304
static int32_t transientIndexToId(unsigned const index)
std::unique_ptr< std::vector< ArrayDatum > > linestring_sizes_data_
GeoMultiPointValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor)
const DictDescriptor * getMetadataForDict(int dict_ref, bool loadDict=true) const
Definition: Catalog.cpp:1999
specifies the content in-memory of a row in the column metadata table
GeoPolygonRenderGroupManager(RenderGroupAnalyzerMap *render_group_analyzer_map, const int column_id)
StringValueConverter(const ColumnDescriptor *cd, size_t num_rows, bool dictEncoded, const shared::StringDictKey &source_dict_key, StringDictionaryProxy *literals_dict)
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
void convertToColumnarFormat(size_t row, const TargetValue *value) override
Global bool for controlling render group assignment, remove along with legacy poly rendering...
std::unique_ptr< ELEMENT_CONVERTER > element_converter_
T get_fixed_array_null_value()
void convertToColumnarFormat(size_t row, const TargetValue *value) override
std::unique_ptr< int32_t[]> render_group_data_
std::shared_ptr< Catalog > getCatalog(const std::string &dbName)
void finalizeDataBlocksForInsertData() override
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
void setValueCaster(CasterFunc caster)
std::vector< DataBlockPtr > data
the number of rows being inserted
Definition: Fragmenter.h:73
int32_t getOrAdd(const std::string &str) noexcept
boost_variant_accessor< GeoMultiLineStringTargetValue > GEO_MULTILINESTRING_VALUE_ACCESSOR
void allocateColumnarData(size_t num_rows) override
int32_t convertTransientStringIdToPermanentId(int32_t &transient_string_id)
void convertToColumnarFormat(size_t row, const TargetValue *value) override
std::unique_ptr< std::vector< std::string > > column_data_
const ColumnDescriptor * render_group_column_descriptor_
typename NumericValueConverter< int64_t, TARGET_TYPE >::ColumnDataPtr ElementsDataColumnPtr
std::unordered_map< int32_t, int32_t > literals_lookup_
RETURN_TYPE checked_cast(SOURCE_TYPE val, bool check_null, RETURN_TYPE null_value)
const ColumnDescriptor * coords_column_descriptor_
void allocateColumnarData(size_t num_rows) override
std::string getString(int32_t string_id) const
GeoMultiPolygonValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor, RenderGroupAnalyzerMap *render_group_analyzer_map)
constexpr auto DOUBLE_MIN
Definition: Types.cpp:41
std::unique_ptr< std::vector< ArrayDatum > > bounds_data_
void allocateColumnarData(size_t num_rows) override
boost_variant_accessor< GeoTargetValue > GEO_VALUE_ACCESSOR
#define NULL_ARRAY_DOUBLE
const ColumnDescriptor * render_group_column_descriptor_
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
static void populate_string_array_ids(std::vector< std::vector< int32_t >> &dest_array_ids, StringDictionary *dest_dict, const std::vector< std::vector< int32_t >> &source_array_ids, const StringDictionary *source_dict)
#define CHECK(condition)
Definition: Logger.h:291
NumericValueConverter< int64_t, TARGET_TYPE >::ColumnDataPtr processBuffer(ElementsBufferColumnPtr buffer)
std::unique_ptr< std::vector< std::pair< size_t, typename ELEMENT_CONVERTER::ElementsBufferColumnPtr > > > column_buffer_
boost_variant_accessor< GeoTargetValue > GEO_TARGET_VALUE_ACCESSOR
GeoMultiLinestringValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor)
Descriptor for a dictionary for a string columne.
const ColumnDescriptor * bounds_column_descriptor_
void convertToColumnarFormat(size_t row, const TargetValue *value) override
void convertToColumnarFormat(size_t row, const TargetValue *value) override
The data to be inserted using the fragment manager.
Definition: Fragmenter.h:68
std::map< int, import_export::RenderGroupAnalyzer > RenderGroupAnalyzerMap
boost::variant< ScalarTargetValue, ArrayTargetValue, GeoTargetValue, GeoTargetValuePtr > TargetValue
Definition: TargetValue.h:195
std::unique_ptr< std::vector< ArrayDatum > > column_data_
SQLTypeInfo columnType
void convertElementToColumnarFormat(size_t row, typename ElementsBufferColumnPtr::pointer columnBuffer, const ScalarTargetValue *scalarValue)
void allocateColumnarData(size_t num_rows) override
void allocateColumnarData(size_t num_rows) override
void convertToColumnarFormat(size_t row, const TargetValue *value) override
int8_t * numbersPtr
Definition: sqltypes.h:223
ElementsBufferColumnPtr allocateColumnarBuffer(size_t num_rows)
void convertToColumnarFormat(size_t row, const TargetValue *value) override
std::unique_ptr< std::vector< ArrayDatum > > bounds_data_
boost_variant_accessor< ArrayTargetValue > ARRAY_VALUE_ACCESSOR
void convertToColumnarFormat(size_t row, const TargetValue *value) override
boost_variant_accessor< GeoPointTargetValue > GEO_POINT_VALUE_ACCESSOR
const ColumnDescriptor * ring_sizes_column_descriptor_
boost_variant_accessor< SOURCE_TYPE > SOURCE_TYPE_ACCESSOR
std::vector< int > columnIds
identifies the table into which the data is being inserted
Definition: Fragmenter.h:71
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
GeoPolygonValueConverter(const Catalog_Namespace::Catalog &cat, size_t num_rows, const ColumnDescriptor *logicalColumnDescriptor, RenderGroupAnalyzerMap *render_group_analyzer_map)
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
int insertBoundsAndReturnRenderGroup(const std::vector< double > &bounds)
std::unique_ptr< std::vector< ArrayDatum > > signed_compressed_coords_data_
void addDataBlocksToInsertData(Fragmenter_Namespace::InsertData &insertData) override
StringDictionaryProxy * source_dict_proxy_
NumericValueConverter(const ColumnDescriptor *cd, size_t num_rows, TARGET_TYPE nullValue, SOURCE_TYPE nullCheckValue, bool doNullCheck)
const shared::StringDictKey & getStringDictKey() const
Definition: sqltypes.h:1021
DictionaryValueConverter(const shared::StringDictKey &source_dict_key, const ColumnDescriptor *targetDescriptor, const Catalog_Namespace::Catalog &target_cat, size_t num_rows, TARGET_TYPE nullValue, int64_t nullCheckValue, bool doNullCheck, StringDictionaryProxy *literals_dict, StringDictionaryProxy *source_dict_proxy)
boost::variant< int64_t, double, float, NullableString > ScalarTargetValue
Definition: TargetValue.h:180