21 namespace Geospatial {
28 throw std::runtime_error(
"Invalid compression");
38 return *
reinterpret_cast<uint64_t*
>(may_alias_ptr(&coord));
47 auto u = *
reinterpret_cast<uint64_t*
>(may_alias_ptr(&n));
53 CHECK(!coords.empty()) <<
"Coord compression received no data";
62 size_t coord_data_size = (is_geoint32) ? (ti.
get_comp_param() / 8) :
sizeof(
double);
63 std::vector<uint8_t> compressed_coords;
64 compressed_coords.reserve(coords.size() * coord_data_size);
65 for (
auto coord : coords) {
72 if (coord < -180.0 || coord > 180.0) {
73 throw std::runtime_error(
"WGS84 longitude " +
std::to_string(coord) +
77 if (coord < -90.0 || coord > 90.0) {
78 throw std::runtime_error(
"WGS84 latitude " +
std::to_string(coord) +
86 auto coord_data_ptr =
reinterpret_cast<uint64_t*
>(&coord);
87 coord_data = *coord_data_ptr;
90 for (
size_t i = 0; i < coord_data_size; i++) {
91 compressed_coords.push_back(coord_data & 0xFF);
96 return compressed_coords;
104 auto elems =
reinterpret_cast<const T*
>(input_ptr);
106 const size_t num_elems = sz /
sizeof(
T);
107 output.resize(num_elems);
108 for (
size_t i = 0; i < num_elems; i++) {
109 output[i] = elems[i];
115 const int8_t* input_ptr,
120 auto elems =
reinterpret_cast<const int32_t*
>(input_ptr);
121 CHECK_EQ(
size_t(0), sz %
sizeof(int32_t));
122 const size_t num_elems = sz /
sizeof(int32_t);
123 output.resize(num_elems);
124 for (
size_t i = 0; i < num_elems; i++) {
125 output[i] = elems[i];
129 template <
typename T>
136 const auto compressed_coords =
reinterpret_cast<const int32_t*
>(enc);
137 const auto num_coords = sz /
sizeof(int32_t);
138 dec.resize(num_coords);
139 for (
size_t i = 0; i < num_coords; i += 2) {
149 const int8_t* coords,
150 const size_t coords_sz) {
151 auto decompressed_coords_ptr = std::make_shared<std::vector<double>>();
153 if (geo_ti.get_comp_param() == 32) {
160 return decompressed_coords_ptr;
166 const int8_t* coords,
167 const size_t coords_sz) {
168 auto decompressed_coords_ptr = std::make_shared<std::vector<double>>();
175 return decompressed_coords_ptr;
179 const int8_t* coords,
180 const size_t coords_sz) {
void decompress_geo_coords_geoint32(std::vector< T > &dec, const int8_t *enc, const size_t sz)
DEVICE uint64_t compress_longitude_coord_geoint32(const double coord)
std::vector< uint8_t > compress_coords(std::vector< double > &coords, const SQLTypeInfo &ti)
int32_t get_compression_scheme(const SQLTypeInfo &ti)
DEVICE double decompress_lattitude_coord_geoint32(const int32_t compressed)
bool is_null_point(const SQLTypeInfo &geo_ti, const int8_t *coords, const size_t coords_sz)
HOST DEVICE SQLTypes get_type() const
DEVICE bool is_null_point_longitude_geoint32(const int32_t compressed)
std::shared_ptr< std::vector< double > > decompress_coords< double, SQLTypeInfo >(const SQLTypeInfo &geo_ti, const int8_t *coords, const size_t coords_sz)
DEVICE constexpr uint64_t compress_null_point_lattitude_geoint32()
HOST DEVICE EncodingType get_compression() const
DEVICE double decompress_longitude_coord_geoint32(const int32_t compressed)
std::shared_ptr< std::vector< double > > decompress_coords< double, int32_t >(const int32_t &ic, const int8_t *coords, const size_t coords_sz)
HOST DEVICE int get_comp_param() const
#define NULL_ARRAY_DOUBLE
void unpack_geo_vector< int32_t >(std::vector< int32_t > &output, const int8_t *input_ptr, const size_t sz)
#define COMPRESSION_GEOINT32
HOST DEVICE bool get_notnull() const
DEVICE constexpr uint64_t compress_null_point_longitude_geoint32()
HOST DEVICE int get_output_srid() const
uint64_t compress_coord(double coord, const SQLTypeInfo &ti, bool x)
DEVICE uint64_t compress_lattitude_coord_geoint32(const double coord)
uint64_t compress_null_point(const SQLTypeInfo &ti, bool x)
void unpack_geo_vector(std::vector< T > &output, const int8_t *input_ptr, const size_t sz)