@@ -50,10 +50,11 @@ type QueryResultHeader struct {
5050
5151// QueryResult represents the results of a query.
5252type QueryResult struct {
53- results [][]interface {}
54- statistics map [string ]float64
55- header QueryResultHeader
56- graph * Graph
53+ graph * Graph
54+ header QueryResultHeader
55+ results []* Record
56+ statistics map [string ]float64
57+ current_record_idx int
5758}
5859
5960func QueryResultNew (g * Graph , response interface {}) (* QueryResult , error ) {
@@ -65,6 +66,7 @@ func QueryResultNew(g *Graph, response interface{}) (*QueryResult, error) {
6566 column_types : make ([]ResultSetColumnTypes , 0 ),
6667 },
6768 graph : g ,
69+ current_record_idx : - 1 ,
6870 }
6971
7072 r , _ := redis .Values (response , nil )
@@ -120,31 +122,30 @@ func (qr *QueryResult) parseHeader(raw_header interface{}) {
120122
121123func (qr * QueryResult ) parseRecords (raw_result_set []interface {}) {
122124 records , _ := redis .Values (raw_result_set [1 ], nil )
123-
124- qr .results = make ([][]interface {}, len (records ))
125+ qr .results = make ([]* Record , len (records ))
125126
126127 for i , r := range records {
127128 cells , _ := redis .Values (r , nil )
128- record := make ([]interface {}, len (cells ))
129+ values := make ([]interface {}, len (cells ))
129130
130131 for idx , c := range cells {
131132 t := qr .header .column_types [idx ]
132133 switch t {
133134 case COLUMN_SCALAR :
134135 s , _ := redis .Values (c , nil )
135- record [idx ] = qr .parseScalar (s )
136+ values [idx ] = qr .parseScalar (s )
136137 break
137138 case COLUMN_NODE :
138- record [idx ] = qr .parseNode (c )
139+ values [idx ] = qr .parseNode (c )
139140 break
140141 case COLUMN_RELATION :
141- record [idx ] = qr .parseEdge (c )
142+ values [idx ] = qr .parseEdge (c )
142143 break
143144 default :
144145 panic ("Unknown column type." )
145146 }
146147 }
147- qr .results [i ] = record
148+ qr .results [i ] = recordNew ( values , qr . header . column_names )
148149 }
149150}
150151
@@ -252,6 +253,36 @@ func (qr *QueryResult) parseScalar(cell []interface{}) interface{} {
252253 return s
253254}
254255
256+ func (qr * QueryResult ) getStat (stat string ) int {
257+ if val , ok := qr .statistics [stat ]; ok {
258+ return int (val )
259+ } else {
260+ return 0
261+ }
262+ }
263+
264+ // Next returns true only if there is a record to be processed.
265+ func (qr * QueryResult ) Next () bool {
266+ if qr .Empty () {
267+ return false
268+ }
269+ if qr .current_record_idx < len (qr .results )- 1 {
270+ qr .current_record_idx ++
271+ return true
272+ } else {
273+ return false
274+ }
275+ }
276+
277+ // Record returns the current record.
278+ func (qr * QueryResult ) Record () * Record {
279+ if qr .current_record_idx >= 0 && qr .current_record_idx < len (qr .results ) {
280+ return qr .results [qr .current_record_idx ]
281+ } else {
282+ return nil
283+ }
284+ }
285+
255286// PrettyPrint prints the QueryResult to stdout, pretty-like.
256287func (qr * QueryResult ) PrettyPrint () {
257288 if qr .Empty () {
@@ -261,13 +292,14 @@ func (qr *QueryResult) PrettyPrint() {
261292 table := tablewriter .NewWriter (os .Stdout )
262293 table .SetAutoFormatHeaders (false )
263294 table .SetHeader (qr .header .column_names )
264-
295+ row_count := len (qr .results )
296+ col_count := len (qr .header .column_names )
265297 if len (qr .results ) > 0 {
266298 // Convert to [][]string.
267- results := make ([][]string , len ( qr . results ) )
299+ results := make ([][]string , row_count )
268300 for i , record := range qr .results {
269- results [i ] = make ([]string , len ( record ) )
270- for j , elem := range record {
301+ results [i ] = make ([]string , col_count )
302+ for j , elem := range record . Values () {
271303 results [i ][j ] = fmt .Sprint (elem )
272304 }
273305 }
@@ -284,14 +316,6 @@ func (qr *QueryResult) PrettyPrint() {
284316 fmt .Fprintf (os .Stdout , "\n " )
285317}
286318
287- func (qr * QueryResult ) getStat (stat string ) int {
288- if val , ok := qr .statistics [stat ]; ok {
289- return int (val )
290- } else {
291- return 0
292- }
293- }
294-
295319func (qr * QueryResult ) LabelsAdded () int {
296320 return qr .getStat (LABELS_ADDED )
297321}
0 commit comments