@@ -29,6 +29,7 @@ import (
2929 "errors"
3030 "fmt"
3131 "path/filepath"
32+ "strings"
3233 "time"
3334
3435 "go.temporal.io/api/serviceerror"
@@ -161,15 +162,14 @@ func (v *visibilityArchiver) Query(
161162 request * archiver.QueryVisibilityRequest ,
162163 saTypeMap searchattribute.NameTypeMap ,
163164) (* archiver.QueryVisibilityResponse , error ) {
164-
165- if err := v .ValidateURI (URI ); err != nil {
166- return nil , & serviceerror.InvalidArgument {Message : archiver .ErrInvalidURI .Error ()}
167- }
168-
169165 if err := archiver .ValidateQueryRequest (request ); err != nil {
170166 return nil , & serviceerror.InvalidArgument {Message : archiver .ErrInvalidQueryVisibilityRequest .Error ()}
171167 }
172168
169+ if strings .TrimSpace (request .Query ) == "" {
170+ return v .queryAll (ctx , URI , request , saTypeMap )
171+ }
172+
173173 parsedQuery , err := v .queryParser .Parse (request .Query )
174174 if err != nil {
175175 return nil , & serviceerror.InvalidArgument {Message : err .Error ()}
@@ -194,26 +194,55 @@ func (v *visibilityArchiver) Query(
194194
195195func (v * visibilityArchiver ) query (
196196 ctx context.Context ,
197- URI archiver.URI ,
197+ uri archiver.URI ,
198198 request * queryVisibilityRequest ,
199199 saTypeMap searchattribute.NameTypeMap ,
200200) (* archiver.QueryVisibilityResponse , error ) {
201+ prefix := constructVisibilityFilenamePrefix (request .namespaceID , indexKeyCloseTimeout )
202+ if ! request .parsedQuery .closeTime .IsZero () {
203+ prefix = constructTimeBasedSearchKey (
204+ request .namespaceID ,
205+ indexKeyCloseTimeout ,
206+ request .parsedQuery .closeTime ,
207+ * request .parsedQuery .searchPrecision ,
208+ )
209+ }
201210
202- token := new ( queryVisibilityToken )
203- if request . nextPageToken != nil {
204- var err error
205- token , err = deserializeQueryVisibilityToken ( request . nextPageToken )
206- if err != nil {
207- return nil , & serviceerror. InvalidArgument { Message : archiver . ErrNextPageTokenCorrupted . Error ()}
208- }
211+ if ! request . parsedQuery . startTime . IsZero () {
212+ prefix = constructTimeBasedSearchKey (
213+ request . namespaceID ,
214+ indexKeyStartTimeout ,
215+ request . parsedQuery . startTime ,
216+ * request . parsedQuery . searchPrecision ,
217+ )
209218 }
210219
211- var prefix = constructVisibilityFilenamePrefix (request .namespaceID , indexKeyCloseTimeout )
212- if ! request .parsedQuery .closeTime .IsZero () {
213- prefix = constructTimeBasedSearchKey (request .namespaceID , indexKeyCloseTimeout , request .parsedQuery .closeTime , * request .parsedQuery .searchPrecision )
220+ return v .queryPrefix (ctx , uri , request , saTypeMap , prefix )
221+ }
222+
223+ func (v * visibilityArchiver ) queryAll (
224+ ctx context.Context ,
225+ URI archiver.URI ,
226+ request * archiver.QueryVisibilityRequest ,
227+ saTypeMap searchattribute.NameTypeMap ,
228+ ) (* archiver.QueryVisibilityResponse , error ) {
229+
230+ return v .queryPrefix (ctx , URI , & queryVisibilityRequest {
231+ namespaceID : request .NamespaceID ,
232+ pageSize : request .PageSize ,
233+ nextPageToken : request .NextPageToken ,
234+ parsedQuery : & parsedQuery {},
235+ }, saTypeMap , request .NamespaceID )
236+ }
237+
238+ func (v * visibilityArchiver ) queryPrefix (ctx context.Context , uri archiver.URI , request * queryVisibilityRequest , saTypeMap searchattribute.NameTypeMap , prefix string ) (* archiver.QueryVisibilityResponse , error ) {
239+ if err := v .ValidateURI (uri ); err != nil {
240+ return nil , & serviceerror.InvalidArgument {Message : archiver .ErrInvalidURI .Error ()}
214241 }
215- if ! request .parsedQuery .startTime .IsZero () {
216- prefix = constructTimeBasedSearchKey (request .namespaceID , indexKeyStartTimeout , request .parsedQuery .startTime , * request .parsedQuery .searchPrecision )
242+
243+ token , err := v .parseToken (request .nextPageToken )
244+ if err != nil {
245+ return nil , err
217246 }
218247
219248 filters := make ([]connector.Precondition , 0 )
@@ -229,14 +258,14 @@ func (v *visibilityArchiver) query(
229258 filters = append (filters , newWorkflowIDPrecondition (hash (* request .parsedQuery .workflowType )))
230259 }
231260
232- filenames , completed , currentCursorPos , err := v .gcloudStorage .QueryWithFilters (ctx , URI , prefix , request .pageSize , token .Offset , filters )
261+ filenames , completed , currentCursorPos , err := v .gcloudStorage .QueryWithFilters (ctx , uri , prefix , request .pageSize , token .Offset , filters )
233262 if err != nil {
234263 return nil , & serviceerror.InvalidArgument {Message : err .Error ()}
235264 }
236265
237266 response := & archiver.QueryVisibilityResponse {}
238267 for _ , file := range filenames {
239- encodedRecord , err := v .gcloudStorage .Get (ctx , URI , fmt .Sprintf ("%s/%s" , request .namespaceID , filepath .Base (file )))
268+ encodedRecord , err := v .gcloudStorage .Get (ctx , uri , fmt .Sprintf ("%s/%s" , request .namespaceID , filepath .Base (file )))
240269 if err != nil {
241270 return nil , & serviceerror.InvalidArgument {Message : err .Error ()}
242271 }
@@ -267,6 +296,18 @@ func (v *visibilityArchiver) query(
267296 return response , nil
268297}
269298
299+ func (v * visibilityArchiver ) parseToken (nextPageToken []byte ) (* queryVisibilityToken , error ) {
300+ token := new (queryVisibilityToken )
301+ if nextPageToken != nil {
302+ var err error
303+ token , err = deserializeQueryVisibilityToken (nextPageToken )
304+ if err != nil {
305+ return nil , & serviceerror.InvalidArgument {Message : archiver .ErrNextPageTokenCorrupted .Error ()}
306+ }
307+ }
308+ return token , nil
309+ }
310+
270311// ValidateURI is used to define what a valid URI for an implementation is.
271312func (v * visibilityArchiver ) ValidateURI (URI archiver.URI ) (err error ) {
272313 ctx , cancel := context .WithTimeout (context .Background (), timeoutInSeconds * time .Second )
0 commit comments