64
64
#include "utils/agtype.h"
65
65
#include "utils/agtype_parser.h"
66
66
#include "utils/ag_float8_supp.h"
67
+ #include "utils/agtype_raw.h"
67
68
#include "catalog/ag_graph.h"
68
69
#include "catalog/ag_label.h"
69
70
#include "utils/graphid.h"
@@ -2181,74 +2182,64 @@ PG_FUNCTION_INFO_V1(_agtype_build_vertex);
2181
2182
*/
2182
2183
Datum _agtype_build_vertex (PG_FUNCTION_ARGS )
2183
2184
{
2184
- agtype_in_state result ;
2185
2185
graphid id ;
2186
+ char * label ;
2187
+ agtype * properties ;
2188
+ agtype_build_state * bstate ;
2189
+ agtype * rawscalar ;
2190
+ agtype * vertex ;
2186
2191
2187
- memset (& result , 0 , sizeof (agtype_in_state ));
2188
-
2189
- result .res = push_agtype_value (& result .parse_state , WAGT_BEGIN_OBJECT ,
2190
- NULL );
2191
-
2192
- /* process graphid */
2193
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2194
- string_to_agtype_value ("id" ));
2195
-
2192
+ /* handles null */
2196
2193
if (fcinfo -> args [0 ].isnull )
2197
2194
{
2198
2195
ereport (ERROR ,
2199
2196
(errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
2200
2197
errmsg ("_agtype_build_vertex() graphid cannot be NULL" )));
2201
2198
}
2202
2199
2203
- id = AG_GETARG_GRAPHID (0 );
2204
- result .res = push_agtype_value (& result .parse_state , WAGT_VALUE ,
2205
- integer_to_agtype_value (id ));
2206
-
2207
- /* process label */
2208
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2209
- string_to_agtype_value ("label" ));
2210
-
2211
2200
if (fcinfo -> args [1 ].isnull )
2212
2201
{
2213
2202
ereport (ERROR , (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
2214
2203
errmsg ("_agtype_build_vertex() label cannot be NULL" )));
2215
2204
}
2216
2205
2217
- result .res =
2218
- push_agtype_value (& result .parse_state , WAGT_VALUE ,
2219
- string_to_agtype_value (PG_GETARG_CSTRING (1 )));
2220
-
2221
- /* process properties */
2222
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2223
- string_to_agtype_value ("properties" ));
2206
+ id = AG_GETARG_GRAPHID (0 );
2207
+ label = PG_GETARG_CSTRING (1 );
2224
2208
2225
- //if the properties object is null, push an empty object
2226
2209
if (fcinfo -> args [2 ].isnull )
2227
2210
{
2228
- result .res = push_agtype_value (& result .parse_state , WAGT_BEGIN_OBJECT ,
2229
- NULL );
2230
- result .res = push_agtype_value (& result .parse_state , WAGT_END_OBJECT ,
2231
- NULL );
2211
+ agtype_build_state * bstate = init_agtype_build_state (0 , AGT_FOBJECT );
2212
+ properties = build_agtype (bstate );
2213
+ pfree_agtype_build_state (bstate );
2232
2214
}
2233
2215
else
2234
2216
{
2235
- agtype * properties = AG_GET_ARG_AGTYPE_P (2 );
2217
+ properties = AG_GET_ARG_AGTYPE_P (2 );
2236
2218
2237
2219
if (!AGT_ROOT_IS_OBJECT (properties ))
2238
2220
{
2239
2221
ereport (ERROR ,
2240
2222
(errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
2241
2223
errmsg ("_agtype_build_vertex() properties argument must be an object" )));
2242
2224
}
2243
-
2244
- add_agtype ((Datum )properties , false, & result , AGTYPEOID , false);
2245
2225
}
2246
2226
2247
- result .res = push_agtype_value (& result .parse_state , WAGT_END_OBJECT , NULL );
2227
+ bstate = init_agtype_build_state (3 , AGT_FOBJECT );
2228
+ write_string (bstate , "id" );
2229
+ write_string (bstate , "label" );
2230
+ write_string (bstate , "properties" );
2231
+ write_graphid (bstate , id );
2232
+ write_string (bstate , label );
2233
+ write_container (bstate , properties );
2234
+ vertex = build_agtype (bstate );
2235
+ pfree_agtype_build_state (bstate );
2248
2236
2249
- result .res -> type = AGTV_VERTEX ;
2237
+ bstate = init_agtype_build_state (1 , AGT_FARRAY | AGT_FSCALAR );
2238
+ write_extended (bstate , vertex , AGT_HEADER_VERTEX );
2239
+ rawscalar = build_agtype (bstate );
2240
+ pfree_agtype_build_state (bstate );
2250
2241
2251
- PG_RETURN_POINTER (agtype_value_to_agtype ( result . res ) );
2242
+ PG_RETURN_POINTER (rawscalar );
2252
2243
}
2253
2244
2254
2245
Datum make_vertex (Datum id , Datum label , Datum properties )
@@ -2263,18 +2254,13 @@ PG_FUNCTION_INFO_V1(_agtype_build_edge);
2263
2254
*/
2264
2255
Datum _agtype_build_edge (PG_FUNCTION_ARGS )
2265
2256
{
2266
- agtype_in_state result ;
2257
+ agtype_build_state * bstate ;
2258
+ agtype * edge , * rawscalar ;
2267
2259
graphid id , start_id , end_id ;
2268
-
2269
- memset (& result , 0 , sizeof (agtype_in_state ));
2270
-
2271
- result .res = push_agtype_value (& result .parse_state , WAGT_BEGIN_OBJECT ,
2272
- NULL );
2260
+ char * label ;
2261
+ agtype * properties ;
2273
2262
2274
2263
/* process graph id */
2275
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2276
- string_to_agtype_value ("id" ));
2277
-
2278
2264
if (fcinfo -> args [0 ].isnull )
2279
2265
{
2280
2266
ereport (ERROR ,
@@ -2283,27 +2269,17 @@ Datum _agtype_build_edge(PG_FUNCTION_ARGS)
2283
2269
}
2284
2270
2285
2271
id = AG_GETARG_GRAPHID (0 );
2286
- result .res = push_agtype_value (& result .parse_state , WAGT_VALUE ,
2287
- integer_to_agtype_value (id ));
2288
2272
2289
2273
/* process label */
2290
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2291
- string_to_agtype_value ("label" ));
2292
-
2293
2274
if (fcinfo -> args [3 ].isnull )
2294
2275
{
2295
2276
ereport (ERROR , (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
2296
2277
errmsg ("_agtype_build_vertex() label cannot be NULL" )));
2297
2278
}
2298
2279
2299
- result .res =
2300
- push_agtype_value (& result .parse_state , WAGT_VALUE ,
2301
- string_to_agtype_value (PG_GETARG_CSTRING (3 )));
2280
+ label = PG_GETARG_CSTRING (3 );
2302
2281
2303
2282
/* process end_id */
2304
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2305
- string_to_agtype_value ("end_id" ));
2306
-
2307
2283
if (fcinfo -> args [2 ].isnull )
2308
2284
{
2309
2285
ereport (ERROR ,
@@ -2312,13 +2288,8 @@ Datum _agtype_build_edge(PG_FUNCTION_ARGS)
2312
2288
}
2313
2289
2314
2290
end_id = AG_GETARG_GRAPHID (2 );
2315
- result .res = push_agtype_value (& result .parse_state , WAGT_VALUE ,
2316
- integer_to_agtype_value (end_id ));
2317
2291
2318
2292
/* process start_id */
2319
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2320
- string_to_agtype_value ("start_id" ));
2321
-
2322
2293
if (fcinfo -> args [1 ].isnull )
2323
2294
{
2324
2295
ereport (ERROR ,
@@ -2327,40 +2298,47 @@ Datum _agtype_build_edge(PG_FUNCTION_ARGS)
2327
2298
}
2328
2299
2329
2300
start_id = AG_GETARG_GRAPHID (1 );
2330
- result .res = push_agtype_value (& result .parse_state , WAGT_VALUE ,
2331
- integer_to_agtype_value (start_id ));
2332
2301
2333
2302
/* process properties */
2334
- result .res = push_agtype_value (& result .parse_state , WAGT_KEY ,
2335
- string_to_agtype_value ("properties" ));
2336
2303
2337
2304
/* if the properties object is null, push an empty object */
2338
2305
if (fcinfo -> args [4 ].isnull )
2339
2306
{
2340
- result .res = push_agtype_value (& result .parse_state , WAGT_BEGIN_OBJECT ,
2341
- NULL );
2342
- result .res = push_agtype_value (& result .parse_state , WAGT_END_OBJECT ,
2343
- NULL );
2307
+ agtype_build_state * bstate = init_agtype_build_state (0 , AGT_FOBJECT );
2308
+ properties = build_agtype (bstate );
2309
+ pfree_agtype_build_state (bstate );
2344
2310
}
2345
2311
else
2346
2312
{
2347
- agtype * properties = AG_GET_ARG_AGTYPE_P (4 );
2313
+ properties = AG_GET_ARG_AGTYPE_P (4 );
2348
2314
2349
2315
if (!AGT_ROOT_IS_OBJECT (properties ))
2350
2316
{
2351
2317
ereport (ERROR ,
2352
2318
(errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
2353
2319
errmsg ("_agtype_build_edge() properties argument must be an object" )));
2354
2320
}
2355
-
2356
- add_agtype ((Datum )properties , false, & result , AGTYPEOID , false);
2357
2321
}
2358
2322
2359
- result .res = push_agtype_value (& result .parse_state , WAGT_END_OBJECT , NULL );
2360
-
2361
- result .res -> type = AGTV_EDGE ;
2362
-
2363
- PG_RETURN_POINTER (agtype_value_to_agtype (result .res ));
2323
+ bstate = init_agtype_build_state (5 , AGT_FOBJECT );
2324
+ write_string (bstate , "id" );
2325
+ write_string (bstate , "label" );
2326
+ write_string (bstate , "end_id" );
2327
+ write_string (bstate , "start_id" );
2328
+ write_string (bstate , "properties" );
2329
+ write_graphid (bstate , id );
2330
+ write_string (bstate , label );
2331
+ write_graphid (bstate , end_id );
2332
+ write_graphid (bstate , start_id );
2333
+ write_container (bstate , properties );
2334
+ edge = build_agtype (bstate );
2335
+ pfree_agtype_build_state (bstate );
2336
+
2337
+ bstate = init_agtype_build_state (1 , AGT_FARRAY | AGT_FSCALAR );
2338
+ write_extended (bstate , edge , AGT_HEADER_EDGE );
2339
+ rawscalar = build_agtype (bstate );
2340
+ pfree_agtype_build_state (bstate );
2341
+ PG_RETURN_POINTER (rawscalar );
2364
2342
}
2365
2343
2366
2344
Datum make_edge (Datum id , Datum startid , Datum endid , Datum label ,
0 commit comments