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