30 namespace foreign_storage {
34 const size_t num_bytes = data.size() *
sizeof(
T);
35 std::shared_ptr<int8_t> buffer(
new int8_t[num_bytes], std::default_delete<int8_t[]>());
36 memcpy(buffer.get(), data.data(), num_bytes);
93 std::list<std::unique_ptr<ChunkMetadata>>& chunk_metadata,
117 auto base_chunk = chunks.begin();
118 base_chunk->initEncoder();
127 chunks, chunk_metadata, geo_column_type,
COORDS);
134 chunks, chunk_metadata, geo_column_type,
BOUNDS);
159 chunks, chunk_metadata, geo_column_type,
POLY_RINGS);
170 <<
"Render Group Values not generated correctly!";
179 if (geo_column_type ==
kPOINT) {
180 CHECK(chunks.size() == 2);
182 CHECK(chunks.size() == 3);
184 CHECK(chunks.size() == 4);
185 }
else if (geo_column_type ==
kPOLYGON) {
186 CHECK(chunks.size() == 5);
188 CHECK(chunks.size() == 6);
193 std::list<std::unique_ptr<ChunkMetadata>>& chunk_metadata)
const {
195 if (geo_column_type ==
kPOINT) {
196 CHECK(chunk_metadata.size() == 2);
198 CHECK(chunk_metadata.size() == 3);
200 CHECK(chunk_metadata.size() == 4);
201 }
else if (geo_column_type ==
kPOLYGON) {
202 CHECK(chunk_metadata.size() == 5);
204 CHECK(chunk_metadata.size() == 6);
222 const std::vector<ArrayDatum>& datum_parse_buffer,
226 CHECK(!chunk_metadata);
229 if (
auto fixed_len_array_encoder =
230 dynamic_cast<FixedLengthArrayNoneEncoder*>(encoder)) {
231 auto new_chunk_metadata = fixed_len_array_encoder->appendData(
232 &datum_parse_buffer, 0, datum_parse_buffer.size());
233 *chunk_metadata = *new_chunk_metadata;
234 }
else if (
auto array_encoder = dynamic_cast<ArrayNoneEncoder*>(encoder)) {
235 auto new_chunk_metadata = array_encoder->appendData(
236 &datum_parse_buffer, 0, datum_parse_buffer.size(),
false);
237 *chunk_metadata = *new_chunk_metadata;
294 auto& render_group_analyzer = *itr->second;
295 render_group = render_group_analyzer.insertBoundsAndReturnRenderGroup(
338 static constexpr int32_t kNullRenderGroupValue = -1;
360 template <
typename T>
365 auto list_iter = list.begin();
367 switch (column_type) {
369 if (geo_column ==
COORDS) {
376 if (geo_column ==
COORDS) {
380 if (geo_column ==
BOUNDS) {
386 if (geo_column ==
COORDS) {
394 if (geo_column ==
BOUNDS) {
400 if (geo_column ==
COORDS) {
408 if (geo_column ==
BOUNDS) {
418 if (geo_column ==
COORDS) {
430 if (geo_column ==
BOUNDS) {
445 std::tuple<Encoder*, ChunkMetadata*, const ColumnDescriptor*>
447 std::list<Chunk_NS::Chunk>& chunks,
448 std::list<std::unique_ptr<ChunkMetadata>>& chunk_metadata,
452 chunk->initEncoder();
453 auto encoder = chunk->getBuffer()->getEncoder();
456 auto column_descriptor = chunk->getColumnDesc();
457 return {encoder, metadata, column_descriptor};
464 auto column_descriptor = chunk->getColumnDesc();
465 return column_descriptor;
469 std::string error_message =
"Failed to extract valid geometry in HeavyDB column '" +
470 omnisci_column_name +
"'.";
477 " doesn't match the geospatial type of HeavyDB column '" +
478 omnisci_column_name +
"'.");
static void throwMismatchedGeoElement(const std::string &omnisci_column_name)
Encoder * render_group_column_encoder_
void processNullGeoElement()
static constexpr bool PROMOTE_POLYGON_TO_MULTIPOLYGON
const ColumnDescriptor * poly_rings_column_descriptor_
const ColumnDescriptor * render_group_column_descriptor_
ChunkMetadata * poly_rings_column_metadata_
std::vector< ArrayDatum > coords_datum_buffer_
std::vector< std::string > base_values_
static ArrayDatum composeNullArray(const SQLTypeInfo &ti)
std::vector< ArrayDatum > ring_or_line_sizes_datum_buffer_
std::vector< int > ring_or_line_sizes_parse_buffer_
std::shared_ptr< ChunkMetadata > appendData(int8_t *&src_data, const size_t num_elems_to_append, const SQLTypeInfo &ti, const bool replicating=false, const int64_t offset=-1) override
Encoder * bounds_column_encoder_
void validateMetadataSizing(std::list< std::unique_ptr< ChunkMetadata >> &chunk_metadata) const
static void getNullGeoColumns(SQLTypeInfo &ti, std::vector< double > &coords, std::vector< double > &bounds, std::vector< int > &ring_sizes, std::vector< int > &poly_rings, const bool promote_poly_to_mpoly=false)
bool hasRenderGroupColumn() const
std::vector< ArrayDatum > bounds_datum_buffer_
HOST DEVICE SQLTypes get_type() const
void appendToArrayEncoderAndUpdateMetadata(const std::vector< ArrayDatum > &datum_parse_buffer, Encoder *encoder, ChunkMetadata *chunk_metadata) const
Encoder * ring_or_line_sizes_column_encoder_
static void throwMalformedGeoElement(const std::string &omnisci_column_name)
std::vector< int32_t > render_group_value_buffer_
std::conditional_t< is_cuda_compiler(), DeviceArrayDatum, HostArrayDatum > ArrayDatum
Encoder * coords_column_encoder_
bool hasRingOrLineSizesColumn() const
std::vector< uint8_t > compress_coords(const std::vector< double > &coords, const SQLTypeInfo &ti)
GeospatialEncoder(const RenderGroupAnalyzerMap *render_group_analyzer_map)
void appendArrayDatumsToBufferAndUpdateMetadata()
GeospatialEncoder(std::list< Chunk_NS::Chunk > &chunks, const RenderGroupAnalyzerMap *render_group_analyzer_map)
void validateChunksSizing(std::list< Chunk_NS::Chunk > &chunks) const
bool hasBoundsColumn() const
specifies the content in-memory of a row in the column metadata table
void processGeoElement(std::string_view geo_string_view)
const ColumnDescriptor * getColumnDescriptor(std::list< Chunk_NS::Chunk > &chunks, const SQLTypes sql_type, GeoColumnType geo_column_type)
const RenderGroupAnalyzerMap * render_group_analyzer_map_
ChunkMetadata * bounds_column_metadata_
ChunkMetadata * base_column_metadata_
ChunkMetadata * render_group_column_metadata_
ChunkMetadata * coords_column_metadata_
ChunkMetadata * ring_or_line_sizes_column_metadata_
const ColumnDescriptor * coords_column_descriptor_
static bool getGeoColumns(const std::string &wkt_or_wkb_hex, SQLTypeInfo &ti, std::vector< double > &coords, std::vector< double > &bounds, std::vector< int > &ring_sizes, std::vector< int > &poly_rings, const bool promote_poly_to_mpoly=false)
std::vector< double > bounds_parse_buffer_
std::vector< double > coords_parse_buffer_
StringNoneEncoder * base_column_encoder_
unencoded fixed length array encoder
void appendBaseAndRenderGroupDataAndUpdateMetadata(const int64_t row_count)
bool hasPolyRingsColumn() const
ArrayDatum encode_as_array_datum(const std::vector< T > &data)
std::vector< int > poly_rings_parse_buffer_
Encoder * poly_rings_column_encoder_
const ColumnDescriptor * geo_column_descriptor_
const ColumnDescriptor * ring_or_line_sizes_column_descriptor_
std::map< int, std::unique_ptr< import_export::RenderGroupAnalyzer >> RenderGroupAnalyzerMap
std::tuple< Encoder *, ChunkMetadata *, const ColumnDescriptor * > initEncoderAndGetEncoderAndMetadata(std::list< Chunk_NS::Chunk > &chunks, std::list< std::unique_ptr< ChunkMetadata >> &chunk_metadata, const SQLTypes sql_type, GeoColumnType geo_column_type)
std::vector< ArrayDatum > poly_rings_datum_buffer_
GeospatialEncoder(std::list< Chunk_NS::Chunk > &chunks, std::list< std::unique_ptr< ChunkMetadata >> &chunk_metadata, const RenderGroupAnalyzerMap *render_group_analyzer_map)
std::list< T >::iterator getIteratorForGeoColumnType(std::list< T > &list, const SQLTypes column_type, const GeoColumnType geo_column)
virtual ~GeospatialEncoder()=default
const ColumnDescriptor * bounds_column_descriptor_
virtual std::shared_ptr< ChunkMetadata > appendData(int8_t *&src_data, const size_t num_elems_to_append, const SQLTypeInfo &ti, const bool replicating=false, const int64_t offset=-1)=0