diff --git a/source/libs/planner/src/physicalPlanJson.c b/source/libs/planner/src/physicalPlanJson.c index d67ff956b9a3b46fdfce21cff72235105f3edd73..992360e5ea5cd2de279f0d7ec1b3afffe90dbf02 100644 --- a/source/libs/planner/src/physicalPlanJson.c +++ b/source/libs/planner/src/physicalPlanJson.c @@ -198,6 +198,29 @@ static bool schemaFromJson(const cJSON* json, void* obj) { return true; } +static const char* jkDataBlockSchemaSlotSchema = "SlotSchema"; +static const char* jkDataBlockSchemaResultRowSize = "resultRowSize"; +static const char* jkDataBlockSchemaPrecision = "Precision"; + +static bool dataBlockSchemaToJson(const void* obj, cJSON* json) { + const SDataBlockSchema* schema = (const SDataBlockSchema*)obj; + bool res = addRawArray(json, jkDataBlockSchemaSlotSchema, schemaToJson, schema->pSchema, sizeof(SSlotSchema), schema->numOfCols); + if (res) { + res = cJSON_AddNumberToObject(json, jkDataBlockSchemaResultRowSize, schema->resultRowSize); + } + if (res) { + res = cJSON_AddNumberToObject(json, jkDataBlockSchemaPrecision, schema->precision); + } + return res; +} + +static bool dataBlockSchemaFromJson(const cJSON* json, void* obj) { + SDataBlockSchema* schema = (SDataBlockSchema*)obj; + schema->resultRowSize = getNumber(json, jkDataBlockSchemaResultRowSize); + schema->precision = getNumber(json, jkDataBlockSchemaPrecision); + return fromRawArray(json, jkDataBlockSchemaSlotSchema, schemaFromJson, schema->pSchema, sizeof(SSlotSchema), &schema->numOfCols); +} + static const char* jkColumnFilterInfoLowerRelOptr = "LowerRelOptr"; static const char* jkColumnFilterInfoUpperRelOptr = "UpperRelOptr"; static const char* jkColumnFilterInfoFilterstr = "Filterstr"; @@ -708,7 +731,7 @@ static bool phyNodeToJson(const void* obj, cJSON* jNode) { res = addArray(jNode, jkPnodeConditions, exprInfoToJson, phyNode->pConditions); } if (res) { - res = addRawArray(jNode, jkPnodeSchema, schemaToJson, phyNode->targetSchema.pSchema, sizeof(SSlotSchema), phyNode->targetSchema.numOfCols); + res = addObject(jNode, jkPnodeSchema, dataBlockSchemaToJson, &phyNode->targetSchema); } if (res) { res = addArray(jNode, jkPnodeChildren, phyNodeToJson, phyNode->pChildren); @@ -728,7 +751,7 @@ static bool phyNodeFromJson(const cJSON* json, void* obj) { res = fromArray(json, jkPnodeConditions, exprInfoFromJson, &node->pConditions, sizeof(SExprInfo)); } if (res) { - res = fromRawArray(json, jkPnodeSchema, schemaFromJson, node->targetSchema.pSchema, sizeof(SSlotSchema), &node->targetSchema.numOfCols); + res = fromObject(json, jkPnodeSchema, dataBlockSchemaFromJson, &node->targetSchema, true); } if (res) { res = fromArray(json, jkPnodeChildren, phyNodeFromJson, &node->pChildren, sizeof(SSlotSchema)); @@ -786,6 +809,7 @@ static bool specificDataSinkFromJson(const cJSON* json, void* obj) { } static const char* jkDataSinkName = "Name"; +static const char* jkDataSinkSchema = "Schema"; static bool dataSinkToJson(const void* obj, cJSON* json) { const SDataSink* dsink = (const SDataSink*)obj; @@ -793,6 +817,9 @@ static bool dataSinkToJson(const void* obj, cJSON* json) { if (res) { res = addObject(json, dsink->info.name, specificDataSinkToJson, dsink); } + if (res) { + res = addObject(json, jkDataSinkSchema, dataBlockSchemaToJson, &dsink->schema); + } return res; } @@ -800,7 +827,11 @@ static bool dataSinkFromJson(const cJSON* json, void* obj) { SDataSink* dsink = (SDataSink*)obj; dsink->info.name = getString(json, jkDataSinkName); dsink->info.type = dsinkNameToDsinkType(dsink->info.name); - return fromObject(json, dsink->info.name, specificDataSinkFromJson, dsink, true); + bool res = fromObject(json, jkDataSinkSchema, dataBlockSchemaFromJson, &dsink->schema, true); + if (res) { + res = fromObject(json, dsink->info.name, specificDataSinkFromJson, dsink, true); + } + return res; } static const char* jkIdQueryId = "QueryId";