github.com/altipla-consulting/ravendb-go-client@v0.1.3/suggestion_document_query.go (about) 1 package ravendb 2 3 import ( 4 "reflect" 5 "time" 6 ) 7 8 // Note: ISuggestionDocumentQuery is SuggestionDocumentQuery 9 10 // SuggestionDocumentQuery represents "suggestion" query 11 type SuggestionDocumentQuery struct { 12 // from SuggestionQueryBase 13 session *InMemoryDocumentSessionOperations 14 query *IndexQuery 15 startTime time.Time 16 17 source *DocumentQuery 18 err error 19 } 20 21 func newSuggestionDocumentQuery(source *DocumentQuery) *SuggestionDocumentQuery { 22 res := &SuggestionDocumentQuery{ 23 source: source, 24 session: source.getSession(), 25 } 26 res.err = source.err 27 return res 28 } 29 30 func (q *SuggestionDocumentQuery) Execute() (map[string]*SuggestionResult, error) { 31 if q.err != nil { 32 return nil, q.err 33 } 34 command, err := q.getCommand() 35 if err != nil { 36 return nil, err 37 } 38 39 q.startTime = time.Now() 40 if err = q.session.incrementRequestCount(); err != nil { 41 return nil, err 42 } 43 if err = q.session.GetRequestExecutor().ExecuteCommand(command, nil); err != nil { 44 return nil, err 45 } 46 47 return q.processResults(command.Result, q.session.GetConventions()) 48 } 49 50 func (q *SuggestionDocumentQuery) processResults(queryResult *QueryResult, conventions *DocumentConventions) (map[string]*SuggestionResult, error) { 51 q.InvokeAfterQueryExecuted(queryResult) 52 53 results := map[string]*SuggestionResult{} 54 55 jsResults := queryResult.Results 56 57 for _, result := range jsResults { 58 suggestionResult, err := treeToValue(reflect.TypeOf(&SuggestionResult{}), result) 59 if err != nil { 60 return nil, err 61 } 62 res := suggestionResult.(*SuggestionResult) 63 results[res.Name] = res 64 } 65 66 err := queryOperationEnsureIsAcceptable(queryResult, q.query.waitForNonStaleResults, q.startTime, q.session) 67 if err != nil { 68 return nil, err 69 } 70 71 return results, nil 72 } 73 74 // onEval: v is map[string]*SuggestionResult 75 func (q *SuggestionDocumentQuery) ExecuteLazy() (*Lazy, error) { 76 if q.err != nil { 77 return nil, q.err 78 } 79 var err error 80 q.query, err = q.getIndexQuery() 81 if err != nil { 82 return nil, err 83 } 84 afterFn := func(result *QueryResult) { 85 q.InvokeAfterQueryExecuted(result) 86 } 87 processFn := func(queryResult *QueryResult, conventions *DocumentConventions) (map[string]*SuggestionResult, error) { 88 res, err := q.processResults(queryResult, conventions) 89 if err != nil { 90 return nil, err 91 } 92 return res, nil 93 } 94 95 op := newLazySuggestionQueryOperation(q.session.Conventions, q.query, afterFn, processFn) 96 return q.session.session.addLazyOperation(op, nil, nil), nil 97 } 98 99 func (q *SuggestionDocumentQuery) InvokeAfterQueryExecuted(result *QueryResult) { 100 q.source.invokeAfterQueryExecuted(result) 101 } 102 103 func (q *SuggestionDocumentQuery) getIndexQuery() (*IndexQuery, error) { 104 if q.err != nil { 105 return nil, q.err 106 } 107 return q.source.GetIndexQuery() 108 } 109 110 func (q *SuggestionDocumentQuery) getCommand() (*QueryCommand, error) { 111 if q.err != nil { 112 return nil, q.err 113 } 114 var err error 115 q.query, err = q.getIndexQuery() 116 if err != nil { 117 return nil, err 118 } 119 120 return NewQueryCommand(q.session.GetConventions(), q.query, false, false) 121 } 122 123 func (q *SuggestionDocumentQuery) string() (string, error) { 124 if q.err != nil { 125 return "", q.err 126 } 127 iq, err := q.getIndexQuery() 128 if err != nil { 129 return "", err 130 } 131 132 return iq.String(), nil 133 }