1
+ # frozen_string_literal: true
2
+
3
+ # Data types that can be returned in result sets
4
+ module ValueType
5
+ UNKNOWN = 0
6
+ NULL = 1
7
+ STRING = 2
8
+ INTEGER = 3
9
+ BOOLEAN = 4
10
+ DOUBLE = 5
11
+ ARRAY = 6
12
+ EDGE = 7
13
+ NODE = 8
14
+ PATH = 9 # TODO: not yet implemented
15
+ end
16
+
1
17
class QueryResult
2
18
attr_accessor :columns
3
19
attr_accessor :resultset
@@ -21,6 +37,8 @@ def initialize(response, opts = {})
21
37
end
22
38
23
39
def print_resultset
40
+ return unless columns
41
+
24
42
pretty = Terminal ::Table . new headings : columns do |t |
25
43
resultset . each { |record | t << record }
26
44
end
@@ -33,7 +51,6 @@ def parse_resultset(response)
33
51
34
52
# Any non-empty result set will have multiple rows (arrays)
35
53
36
-
37
54
# First row is header describing the returned records, corresponding
38
55
# precisely in order and naming to the RETURN clause of the query.
39
56
header = response [ 0 ]
@@ -47,19 +64,7 @@ def parse_resultset(response)
47
64
header . reduce ( [ ] ) do |agg , ( type , _it ) |
48
65
i += 1
49
66
el = row [ i ]
50
-
51
- case type
52
- when 1 # scalar
53
- agg << map_scalar ( el [ 0 ] , el [ 1 ] )
54
- when 2 # node
55
- props = el [ 2 ]
56
- agg << props . sort_by { |prop | prop [ 0 ] } . map { |prop | map_prop ( prop ) }
57
- when 3 # relation
58
- props = el [ 4 ]
59
- agg << props . sort_by { |prop | prop [ 0 ] } . map { |prop | map_prop ( prop ) }
60
- end
61
-
62
- agg
67
+ agg << map_scalar ( el [ 0 ] , el [ 1 ] )
63
68
end
64
69
end
65
70
@@ -68,25 +73,23 @@ def parse_resultset(response)
68
73
69
74
def map_scalar ( type , val )
70
75
map_func = case type
71
- when 1 # null
76
+ when ValueType :: NULL
72
77
return nil
73
- when 2 # string
78
+ when ValueType :: STRING
74
79
:to_s
75
- when 3 # integer
80
+ when ValueType :: INTEGER
76
81
:to_i
77
- when 4 # boolean
82
+ when ValueType :: BOOLEAN
78
83
# no :to_b
79
- return val == " true"
80
- when 5 # double
84
+ return val == ' true'
85
+ when ValueType :: DOUBLE
81
86
:to_f
82
- # TODO: when in the distro packages and docker images,
83
- # the following _should_ work
84
- # when 6 # array
85
- # val.map { |it| map_scalar(it[0], it[1]) }
86
- when 7 # relation
87
+ when ValueType ::ARRAY
88
+ return val . map { |it | map_scalar ( it [ 0 ] , it [ 1 ] ) }
89
+ when ValueType ::EDGE
87
90
props = val [ 4 ]
88
91
return props . sort_by { |prop | prop [ 0 ] } . map { |prop | map_prop ( prop ) }
89
- when 8 # node
92
+ when ValueType :: NODE
90
93
props = val [ 2 ]
91
94
return props . sort_by { |prop | prop [ 0 ] } . map { |prop | map_prop ( prop ) }
92
95
end
@@ -98,7 +101,7 @@ def map_prop(prop)
98
101
99
102
property_keys = @metadata . property_keys
100
103
prop_index = prop [ 0 ]
101
- if prop_index > property_keys . length
104
+ if prop_index >= property_keys . length
102
105
@metadata . invalidate
103
106
property_keys = @metadata . property_keys
104
107
end
0 commit comments