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:
parent
ac222369f0
commit
421cb87e57
8 changed files with 82 additions and 23 deletions
|
|
@ -37,7 +37,7 @@ int main()
|
||||||
"CREATE NODE TABLE Test ( id SERIAL, thing STRING, PRIMARY KEY(id) )",
|
"CREATE NODE TABLE Test ( id SERIAL, thing STRING, PRIMARY KEY(id) )",
|
||||||
&q ) != KuzuSuccess ) {
|
&q ) != KuzuSuccess ) {
|
||||||
printf( "Couldn't create schema?!\n" );
|
printf( "Couldn't create schema?!\n" );
|
||||||
return( 1 );
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ int main()
|
||||||
&stmt
|
&stmt
|
||||||
) != KuzuSuccess ) {
|
) != KuzuSuccess ) {
|
||||||
printf( "Couldn't prepare statement?\n" );
|
printf( "Couldn't prepare statement?\n" );
|
||||||
return( 1 );
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -79,4 +79,3 @@ int main()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,55 @@ proc `=destroy`*( query: KuzuQueryResultObj ) =
|
||||||
## Graceful cleanup for out of scope query objects.
|
## Graceful cleanup for out of scope query objects.
|
||||||
if query.valid:
|
if query.valid:
|
||||||
kuzu_query_result_destroy( addr query.handle )
|
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 =
|
proc query*( conn: KuzuConnection, query: string ): KuzuQueryResult =
|
||||||
## Perform a database +query+ and return the result.
|
## Perform a database +query+ and return the result.
|
||||||
result = new KuzuQueryResult
|
result = new KuzuQueryResult
|
||||||
|
|
||||||
if kuzu_connection_query( addr conn.handle, query, addr result.handle ) == KuzuSuccess:
|
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:
|
else:
|
||||||
var err = kuzu_query_result_get_error_message( addr result.handle )
|
var err = kuzu_query_result_get_error_message( addr result.handle )
|
||||||
raise newException( KuzuQueryException, &"Error running query: {err}" )
|
raise newException( KuzuQueryException, &"Error running query: {err}" )
|
||||||
|
|
|
||||||
|
|
@ -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:
|
if kuzu_flat_tuple_get_value( addr tpl.handle, idx.uint64, addr result.handle ) == KuzuSuccess:
|
||||||
result.valid = true
|
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:
|
else:
|
||||||
raise newException( KuzuIndexException,
|
raise newException( KuzuIndexException,
|
||||||
&"Unable to fetch tuple value at idx {idx}. ({tpl.num_columns} column(s).)" )
|
&"Unable to fetch tuple value at idx {idx}. ({tpl.num_columns} column(s).)" )
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,12 @@ type
|
||||||
|
|
||||||
KuzuQueryResultObj = object
|
KuzuQueryResultObj = object
|
||||||
handle: kuzu_query_result
|
handle: kuzu_query_result
|
||||||
summary: kuzu_query_summary
|
|
||||||
num_columns*: uint64 = 0
|
num_columns*: uint64 = 0
|
||||||
num_tuples*: uint64 = 0
|
num_tuples*: uint64 = 0
|
||||||
compile_time*: cdouble = 0
|
compile_time*: cdouble = 0
|
||||||
execution_time*: cdouble = 0
|
execution_time*: cdouble = 0
|
||||||
|
column_types*: seq[ kuzu_data_type_id ]
|
||||||
|
column_names*: seq[ string ]
|
||||||
valid = false
|
valid = false
|
||||||
KuzuQueryResult* = ref KuzuQueryResultObj
|
KuzuQueryResult* = ref KuzuQueryResultObj
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,33 @@ proc `$`*( value: KuzuValue ): string =
|
||||||
result = $kuzu_value_to_string( addr value.handle )
|
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 `$`.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,5 @@
|
||||||
import re
|
import re
|
||||||
import kuzu
|
import kuzu
|
||||||
|
|
||||||
assert KUZU_LIBVERSION.contains( re"^\d+\.\d+\.\d+$" )
|
assert KUZU_LIBVERSION.contains( re"^\d+\.\d+\.\d+(?:\.\d+)?$" )
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ for thing in @[ "Camel", "Lampshade", "Delicious Cake" ]:
|
||||||
q = p.execute( (thing: thing) )
|
q = p.execute( (thing: thing) )
|
||||||
assert typeOf( q ) is KuzuQueryResult
|
assert typeOf( q ) is KuzuQueryResult
|
||||||
|
|
||||||
# This is failing until I can address
|
# Fixed post v0.8.2:
|
||||||
# https://github.com/kuzudb/kuzu/issues/5102
|
# https://github.com/kuzudb/kuzu/issues/5102
|
||||||
q = conn.query( "MATCH (d:Doop) RETURN d.thing" )
|
q = conn.query( "MATCH (d:Doop) RETURN d.thing" )
|
||||||
echo $q
|
echo $q
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ q = conn.query( "MATCH (d:Doop) RETURN d.thing" )
|
||||||
assert q.num_tuples == 1
|
assert q.num_tuples == 1
|
||||||
assert q.hasNext == true
|
assert q.hasNext == true
|
||||||
|
|
||||||
discard $q # consume the tuple result
|
discard q.getNext # consume the tuple result
|
||||||
|
|
||||||
assert q.num_tuples == 1
|
assert q.num_tuples == 1
|
||||||
assert q.hasNext == false
|
assert q.hasNext == false
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue