PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ parse_values()

static void parse_values ( mvt_agg_context ctx)
static

Definition at line 681 of file mvt.c.

682{
683 uint32_t n_keys = ctx->keys_hash_i;
684 uint32_t *tags = palloc(n_keys * 2 * sizeof(*tags));
685 uint32_t i;
687 uint32_t natts = (uint32_t) cc.tupdesc->natts;
688
689 HeapTupleData tuple;
690
691 POSTGIS_DEBUG(2, "parse_values called");
692 ctx->row_columns = 0;
693
694 /* Build a temporary HeapTuple control structure */
695 tuple.t_len = HeapTupleHeaderGetDatumLength(ctx->row);
696 ItemPointerSetInvalid(&(tuple.t_self));
697 tuple.t_tableOid = InvalidOid;
698 tuple.t_data = ctx->row;
699
700 /* We use heap_deform_tuple as it costs only O(N) vs O(N^2) of GetAttributeByNum */
701 heap_deform_tuple(&tuple, cc.tupdesc, cc.values, cc.nulls);
702
703 POSTGIS_DEBUGF(3, "parse_values natts: %d", natts);
704
705 for (i = 0; i < natts; i++)
706 {
707 char *key;
708 Oid typoid;
709 uint32_t k;
710 Datum datum = cc.values[i];
711
712 if (i == ctx->geom_index)
713 continue;
714
715 if (i == ctx->id_index)
716 {
717 set_feature_id(ctx, datum, cc.nulls[i]);
718 continue;
719 }
720
721 if (cc.nulls[i])
722 {
723 POSTGIS_DEBUG(3, "parse_values isnull detected");
724 continue;
725 }
726
727 key = TupleDescAttr(cc.tupdesc, i)->attname.data;
728 k = cc.column_keys_index[i];
729 typoid = cc.column_oid[i];
730
731 if (k == UINT32_MAX && typoid != JSONBOID)
732 elog(ERROR, "parse_values: unexpectedly could not find parsed key name '%s'", key);
733 if (typoid == JSONBOID)
734 {
735 tags = parse_jsonb(ctx, DatumGetJsonbP(datum), tags);
736 continue;
737 }
738
739 switch (typoid)
740 {
741 case BOOLOID:
742 MVT_PARSE_DATUM(protobuf_c_boolean, mvt_kv_bool_value,
743 bool_values_hash, bool_value,
744 DatumGetBool, sizeof(protobuf_c_boolean));
745 break;
746 case INT2OID:
747 MVT_PARSE_INT_DATUM(int16_t, DatumGetInt16);
748 break;
749 case INT4OID:
750 MVT_PARSE_INT_DATUM(int32_t, DatumGetInt32);
751 break;
752 case INT8OID:
753 MVT_PARSE_INT_DATUM(int64_t, DatumGetInt64);
754 break;
755 case FLOAT4OID:
757 float_values_hash, float_value,
758 DatumGetFloat4, sizeof(float));
759 break;
760 case FLOAT8OID:
762 double_values_hash, double_value,
763 DatumGetFloat8, sizeof(double));
764 break;
765 default:
766 parse_datum_as_string(ctx, typoid, datum, tags, k);
767 break;
768 }
769
770 ctx->row_columns++;
771 }
772
773
774 ctx->feature->n_tags = ctx->row_columns * 2;
775 ctx->feature->tags = tags;
776
777 POSTGIS_DEBUGF(3, "parse_values n_tags %zd", ctx->feature->n_tags);
778}
#define UINT32_MAX
static void parse_datum_as_string(mvt_agg_context *ctx, Oid typoid, Datum datum, uint32_t *tags, uint32_t k)
Definition mvt.c:550
static void set_feature_id(mvt_agg_context *ctx, Datum datum, bool isNull)
Sets the feature id.
Definition mvt.c:645
#define MVT_PARSE_INT_DATUM(type, datumfunc)
Definition mvt.c:517
#define DatumGetJsonbP
Definition mvt.c:38
static uint32_t * parse_jsonb(mvt_agg_context *ctx, Jsonb *jb, uint32_t *tags)
Definition mvt.c:563
#define MVT_PARSE_DATUM(type, kvtype, hash, valuefield, datumfunc, size)
Definition mvt.c:511
uint32_t geom_index
Definition mvt.h:64
uint32_t keys_hash_i
Definition mvt.h:78
VectorTile__Tile__Feature * feature
Definition mvt.h:66
uint32_t id_index
Definition mvt.h:62
HeapTupleHeader row
Definition mvt.h:65
mvt_column_cache column_cache
Definition mvt.h:80
uint32_t row_columns
Definition mvt.h:79
TupleDesc tupdesc
Definition mvt.h:54

References 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: