133
134
// QueryWithFilters, retieves filenames that match filter parameters. PageSize is optional, 0 means all records.
135
>
func (s *storageWrapper) QueryWithFilters(ctx context.Context, URI archiver.URI, fileNamePrefix string, pageSize, offset int, filters []Precondition) ([]string, bool, int, error) {
client.go
136
>
var err error
137
>
currentPos := offset
138
>
resultSet := make([]string, 0)
139
>
bucket := s.client.Bucket(URI.Hostname())
140
>
var attrs = new(storage.ObjectAttrs)
141
>
it := bucket.Objects(ctx, &storage.Query{
142
>
Prefix: formatSinkPath(URI.Path()) + "/" + fileNamePrefix,
143
>
})
144
>
145
>
for {
146
>
attrs, err = it.Next()
147
>
if err == iterator.Done {
148
>
return resultSet, true, currentPos, nil
149
>
}
150
151
>
if completed := isPageCompleted(pageSize, len(resultSet)); completed {
client.go
152
return resultSet, completed, currentPos, err
153
}
154
156
>
for _, f := range filters {
157
>
if valid = f(attrs.Name); !valid {
158
>
break
159
}
160
}
161
163
>
if offset > 0 {
164
offset--
165
continue
166
}
167
// if match parsedQuery criteria and current cursor position is the last known position (offset is zero), append fileName to resultSet
168
>
resultSet = append(resultSet, attrs.Name)
client.go
169
>
currentPos++
170
}
171
}