@@ -344,45 +344,31 @@ func (m *Mock) Query(ctx context.Context, q Query) (*Cursor, error) {
344344 return nil , query .Error
345345 }
346346
347- var conn * Connection = nil
348- responseVal := reflect .ValueOf (query .Response )
349- if responseVal .Kind () == reflect .Chan || responseVal .Kind () == reflect .Func {
350- conn = newConnection (newMockConn (query .Response ), "mock" , & ConnectOpts {})
351-
352- query .Query .Type = p .Query_CONTINUE
353- query .Query .Token = conn .nextToken ()
354-
355- conn .runConnection ()
356- }
357-
358347 if ctx == nil {
359348 ctx = context .Background ()
360349 }
361350
351+ conn := newConnection (newMockConn (query .Response ), "mock" , & ConnectOpts {})
352+
353+ query .Query .Type = p .Query_CONTINUE
354+ query .Query .Token = conn .nextToken ()
355+
362356 // Build cursor and return
363357 c := newCursor (ctx , conn , "" , query .Query .Token , query .Query .Term , query .Query .Opts )
364358 c .finished = true
365359 c .fetching = false
366360 c .isAtom = true
361+ c .finished = false
362+ c .releaseConn = func () error { return conn .Close () }
367363
368- if responseVal .Kind () == reflect .Slice || responseVal .Kind () == reflect .Array {
369- for i := 0 ; i < responseVal .Len (); i ++ {
370- c .buffer = append (c .buffer , responseVal .Index (i ).Interface ())
371- }
372- } else if conn != nil {
373- conn .cursors [query .Query .Token ] = c
374- c .finished = false
375- c .releaseConn = func () error {
376- return conn .Close ()
377- }
378- c .mu .Lock ()
379- err := c .fetchMore ()
380- c .mu .Unlock ()
381- if err != nil {
382- return nil , err
383- }
384- } else {
385- c .buffer = append (c .buffer , query .Response )
364+ conn .cursors [query .Query .Token ] = c
365+ conn .runConnection ()
366+
367+ c .mu .Lock ()
368+ err := c .fetchMore ()
369+ c .mu .Unlock ()
370+ if err != nil {
371+ return nil , err
386372 }
387373
388374 return c , nil
@@ -444,19 +430,39 @@ type mockConn struct {
444430 valueGetter func () []interface {}
445431}
446432
447- func newMockConn (responseGetter interface {}) * mockConn {
433+ func newMockConn (response interface {}) * mockConn {
448434 c := & mockConn {tokens : make (chan int64 , 1 )}
449- switch g := responseGetter .(type ) {
435+ switch g := response .(type ) {
450436 case chan []interface {}:
451437 c .valueGetter = func () []interface {} { return <- g }
452438 case func () []interface {}:
453439 c .valueGetter = g
454440 default :
455- panic (fmt .Sprintf ("unsupported value generator type: %T" , responseGetter ))
441+ responseVal := reflect .ValueOf (response )
442+ if responseVal .Kind () == reflect .Slice || responseVal .Kind () == reflect .Array {
443+ responses := make ([]interface {}, responseVal .Len ())
444+ for i := 0 ; i < responseVal .Len (); i ++ {
445+ responses [i ] = responseVal .Index (i ).Interface ()
446+ }
447+ c .valueGetter = funcGetter (responses )
448+ } else {
449+ c .valueGetter = funcGetter ([]interface {}{response })
450+ }
456451 }
457452 return c
458453}
459454
455+ func funcGetter (responses []interface {}) func () []interface {} {
456+ done := false
457+ return func () []interface {} {
458+ if done {
459+ return nil
460+ }
461+ done = true
462+ return responses
463+ }
464+ }
465+
460466func (c * mockConn ) Read (b []byte ) (n int , err error ) {
461467 c .mu .Lock ()
462468 defer c .mu .Unlock ()
0 commit comments