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