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