Checkpoint.

- Add column names and types to KuzuQuery objects.
- Start sketching out type conversions.
- Add a "kind" method to KuzuValue, that returns its Kuzu type. (type is a
  reserved word)
- Fix some tests for post v0.8.2 behaviors.

FossilOrigin-Name: 64c0694e58507ce91f2e0eced106c9fef2a739665ddaa29f60b4ca9fe65678fe
This commit is contained in:
mahlon 2025-03-27 08:09:17 +00:00
parent ac222369f0
commit 421cb87e57
8 changed files with 82 additions and 23 deletions

View file

@ -4,19 +4,55 @@ proc `=destroy`*( query: KuzuQueryResultObj ) =
## Graceful cleanup for out of scope query objects.
if query.valid:
kuzu_query_result_destroy( addr query.handle )
kuzu_query_summary_destroy( addr query.summary )
proc getQueryMetadata( query: KuzuQueryResult ) =
## Find and retain additional data for the query.
query.num_columns = kuzu_query_result_get_num_columns( addr query.handle )
query.num_tuples = kuzu_query_result_get_num_tuples( addr query.handle )
# Summary information.
var summary: kuzu_query_summary
discard kuzu_query_result_get_query_summary( addr query.handle, addr summary )
query.compile_time = kuzu_query_summary_get_compiling_time( addr summary )
query.execution_time = kuzu_query_summary_get_execution_time( addr summary )
kuzu_query_summary_destroy( addr summary )
# Column information.
query.column_types = @[]
query.column_names = @[]
for idx in ( 0 .. query.num_columns-1 ):
# types
#
var logical_type: kuzu_logical_type
discard kuzu_query_result_get_column_data_type(
addr query.handle,
idx,
addr logical_type
)
query.column_types.add( kuzu_data_type_get_id( addr logical_type ))
kuzu_data_type_destroy( addr logical_type )
# names
#
var name: cstring
discard kuzu_query_result_get_column_name(
addr query.handle,
idx,
addr name
)
query.column_names.add( $name )
kuzu_destroy_string( name )
proc query*( conn: KuzuConnection, query: string ): KuzuQueryResult =
## Perform a database +query+ and return the result.
result = new KuzuQueryResult
if kuzu_connection_query( addr conn.handle, query, addr result.handle ) == KuzuSuccess:
discard kuzu_query_result_get_query_summary( addr result.handle, addr result.summary )
result.num_columns = kuzu_query_result_get_num_columns( addr result.handle )
result.num_tuples = kuzu_query_result_get_num_tuples( addr result.handle )
result.compile_time = kuzu_query_summary_get_compiling_time( addr result.summary )
result.execution_time = kuzu_query_summary_get_execution_time( addr result.summary )
result.valid = true
result.valid = true
result.getQueryMetadata()
else:
var err = kuzu_query_result_get_error_message( addr result.handle )
raise newException( KuzuQueryException, &"Error running query: {err}" )

View file

@ -18,13 +18,6 @@ proc `[]`*( tpl: KuzuFlatTuple, idx: int ): KuzuValue =
if kuzu_flat_tuple_get_value( addr tpl.handle, idx.uint64, addr result.handle ) == KuzuSuccess:
result.valid = true
#
# FIXME: type checks and conversions from supported kuzu
# types to supported Nim types.
#
# Currently the value can only be stringified via `$`.
#
else:
raise newException( KuzuIndexException,
&"Unable to fetch tuple value at idx {idx}. ({tpl.num_columns} column(s).)" )

View file

@ -15,11 +15,12 @@ type
KuzuQueryResultObj = object
handle: kuzu_query_result
summary: kuzu_query_summary
num_columns*: uint64 = 0
num_tuples*: uint64 = 0
compile_time*: cdouble = 0
execution_time*: cdouble = 0
column_types*: seq[ kuzu_data_type_id ]
column_names*: seq[ string ]
valid = false
KuzuQueryResult* = ref KuzuQueryResultObj

View file

@ -11,3 +11,33 @@ proc `$`*( value: KuzuValue ): string =
result = $kuzu_value_to_string( addr value.handle )
proc kind*( value: KuzuValue ): kuzu_data_type_id =
## Find and return the native Kuzu type of this value.
var logical_type: kuzu_logical_type
kuzu_value_get_data_type( addr value.handle, addr logical_type )
result = kuzu_data_type_get_id( addr logical_type )
# var num: uint64
# discard kuzu_data_type_get_num_elements_in_array( addr logical_type, addr num )
# echo "HMMM ", $num
kuzu_data_type_destroy( addr logical_type )
# enum_kuzu_data_type_id_570425857* {.size: sizeof(cuint).} = enum
# KUZU_ANY = 0, KUZU_NODE = 10, KUZU_REL = 11, KUZU_RECURSIVE_REL = 12,
# KUZU_SERIAL = 13, KUZU_BOOL = 22, KUZU_INT64 = 23, KUZU_INT32 = 24,
# KUZU_INT16 = 25, KUZU_INT8 = 26, KUZU_UINT64 = 27, KUZU_UINT32 = 28,
# KUZU_UINT16 = 29, KUZU_UINT8 = 30, KUZU_INT128 = 31, KUZU_DOUBLE = 32,
# KUZU_FLOAT = 33, KUZU_DATE = 34, KUZU_TIMESTAMP = 35,
# KUZU_TIMESTAMP_SEC = 36, KUZU_TIMESTAMP_MS = 37, KUZU_TIMESTAMP_NS = 38,
# KUZU_TIMESTAMP_TZ = 39, KUZU_INTERVAL = 40, KUZU_DECIMAL = 41,
# KUZU_INTERNAL_ID = 42, KUZU_STRING = 50, KUZU_BLOB = 51, KUZU_LIST = 52,
# KUZU_ARRAY = 53, KUZU_STRUCT = 54, KUZU_MAP = 55, KUZU_UNION = 56,
# KUZU_POINTER = 58, KUZU_UUID = 59
# proc getValue*( value: KuzuValue ):
#
# FIXME: type checks and conversions from supported kuzu
# types to supported Nim types.
#
# Currently the value can only be stringified via `$`.
#