PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ parse_values()

static void parse_values ( mvt_agg_context ctx)
static

Definition at line 632 of file mvt.c.

633 {
634  uint32_t n_keys = ctx->keys_hash_i;
635  uint32_t *tags = palloc(n_keys * 2 * sizeof(*tags));
636  uint32_t i;
637  mvt_column_cache cc = ctx->column_cache;
638  uint32_t natts = (uint32_t) cc.tupdesc->natts;
639 
640  HeapTupleData tuple;
641 
642  POSTGIS_DEBUG(2, "parse_values called");
643  ctx->row_columns = 0;
644 
645  /* Build a temporary HeapTuple control structure */
646  tuple.t_len = HeapTupleHeaderGetDatumLength(ctx->row);
647  ItemPointerSetInvalid(&(tuple.t_self));
648  tuple.t_tableOid = InvalidOid;
649  tuple.t_data = ctx->row;
650 
651  /* We use heap_deform_tuple as it costs only O(N) vs O(N^2) of GetAttributeByNum */
652  heap_deform_tuple(&tuple, cc.tupdesc, cc.values, cc.nulls);
653 
654  POSTGIS_DEBUGF(3, "parse_values natts: %d", natts);
655 
656  for (i = 0; i < natts; i++)
657  {
658  char *key;
659  Oid typoid;
660  uint32_t k;
661  Datum datum = cc.values[i];
662 
663  if (i == ctx->geom_index)
664  continue;
665 
666  if (i == ctx->id_index)
667  {
668  set_feature_id(ctx, datum, cc.nulls[i]);
669  continue;
670  }
671 
672  if (cc.nulls[i])
673  {
674  POSTGIS_DEBUG(3, "parse_values isnull detected");
675  continue;
676  }
677 
678  key = TupleDescAttr(cc.tupdesc, i)->attname.data;
679  k = cc.column_keys_index[i];
680  typoid = cc.column_oid[i];
681 
682  if (k == UINT32_MAX && typoid != JSONBOID)
683  elog(ERROR, "parse_values: unexpectedly could not find parsed key name '%s'", key);
684  if (typoid == JSONBOID)
685  {
686  tags = parse_jsonb(ctx, DatumGetJsonbP(datum), tags);
687  continue;
688  }
689 
690  switch (typoid)
691  {
692  case BOOLOID:
693  MVT_PARSE_DATUM(protobuf_c_boolean,
694  DatumGetBool,
695  bool_values_hash,
696  sizeof(protobuf_c_boolean),
697  bool_value,
698  VECTOR_TILE__TILE__VALUE__TEST_ONEOF_BOOL_VALUE);
699  break;
700  case INT2OID:
701  MVT_PARSE_INT_DATUM(int16_t, DatumGetInt16);
702  break;
703  case INT4OID:
704  MVT_PARSE_INT_DATUM(int32_t, DatumGetInt32);
705  break;
706  case INT8OID:
707  MVT_PARSE_INT_DATUM(int64_t, DatumGetInt64);
708  break;
709  case FLOAT4OID:
710  MVT_PARSE_DATUM(float,
711  DatumGetFloat4,
712  float_values_hash,
713  sizeof(float),
714  float_value,
715  VECTOR_TILE__TILE__VALUE__TEST_ONEOF_FLOAT_VALUE);
716  break;
717  case FLOAT8OID:
718  MVT_PARSE_DATUM(double,
719  DatumGetFloat8,
720  double_values_hash,
721  sizeof(double),
722  double_value,
723  VECTOR_TILE__TILE__VALUE__TEST_ONEOF_DOUBLE_VALUE);
724  break;
725  case TEXTOID:
726  add_value_as_string(ctx, text_to_cstring(DatumGetTextP(datum)), tags, k);
727  break;
728  case CSTRINGOID:
729  add_value_as_string(ctx, DatumGetCString(datum), tags, k);
730  break;
731  default:
732  parse_datum_as_string(ctx, typoid, datum, tags, k);
733  break;
734  }
735 
736  ctx->row_columns++;
737  }
738 
739 
740  ctx->feature->n_tags = ctx->row_columns * 2;
741  ctx->feature->tags = tags;
742 
743  POSTGIS_DEBUGF(3, "parse_values n_tags %zd", ctx->feature->n_tags);
744 }
#define UINT32_MAX
Definition: lwin_wkt_lex.c:343
static void parse_datum_as_string(mvt_agg_context *ctx, Oid typoid, Datum datum, uint32_t *tags, uint32_t k)
Definition: mvt.c:497
#define MVT_PARSE_DATUM(type, datumfunc, hash, size, pfvaluefield, pftype)
Definition: mvt.c:447
static void set_feature_id(mvt_agg_context *ctx, Datum datum, bool isNull)
Sets the feature id.
Definition: mvt.c:596
#define MVT_PARSE_INT_DATUM(type, datumfunc)
Definition: mvt.c:453
static uint32_t * parse_jsonb(mvt_agg_context *ctx, Jsonb *jb, uint32_t *tags)
Definition: mvt.c:509
#define DatumGetJsonbP
Definition: mvt.c:41
static void add_value_as_string(mvt_agg_context *ctx, char *value, uint32_t *tags, uint32_t k)
Definition: mvt.c:488
uint32_t geom_index
Definition: mvt.h:72
uint32_t keys_hash_i
Definition: mvt.h:94
VectorTile__Tile__Feature * feature
Definition: mvt.h:75
uint32_t id_index
Definition: mvt.h:68
HeapTupleHeader row
Definition: mvt.h:74
mvt_column_cache column_cache
Definition: mvt.h:97
uint32_t row_columns
Definition: mvt.h:96
bool * nulls
Definition: mvt.h:53
TupleDesc tupdesc
Definition: mvt.h:54
uint32_t * column_keys_index
Definition: mvt.h:50
Datum * values
Definition: mvt.h:52
uint32_t * column_oid
Definition: mvt.h:51

References add_value_as_string(), mvt_agg_context::column_cache, mvt_column_cache::column_keys_index, mvt_column_cache::column_oid, DatumGetJsonbP, mvt_agg_context::feature, mvt_agg_context::geom_index, mvt_agg_context::id_index, mvt_agg_context::keys_hash_i, MVT_PARSE_DATUM, MVT_PARSE_INT_DATUM, mvt_column_cache::nulls, parse_datum_as_string(), parse_jsonb(), mvt_agg_context::row, mvt_agg_context::row_columns, set_feature_id(), mvt_column_cache::tupdesc, UINT32_MAX, and mvt_column_cache::values.

Referenced by mvt_agg_transfn().

Here is the call graph for this function:
Here is the caller graph for this function: