-
Notifications
You must be signed in to change notification settings - Fork 451
/
types.go
227 lines (180 loc) · 7.1 KB
/
types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
// Copyright (c) 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package segment
import (
"errors"
"github.com/m3db/m3/src/m3ninx/doc"
"github.com/m3db/m3/src/m3ninx/index"
"github.com/m3db/m3/src/m3ninx/postings"
)
var (
// ErrClosed is the error returned when attempting to perform operations on a
// segment that has already been closed.
ErrClosed = errors.New("segment has been closed")
)
// Segment is a sub-collection of documents within an index.
type Segment interface {
// FieldsIterable returns an iterable fields, for which is not
// safe for concurrent use. For concurrent use call FieldsIterable
// multiple times.
FieldsIterable() FieldsIterable
// TermsIterable returns an iterable terms, for which is not
// safe for concurrent use. For concurrent use call TermsIterable
// multiple times.
TermsIterable() TermsIterable
// Size returns the number of documents within the Segment. It returns
// 0 if the Segment has been closed.
Size() int64
// ContainsID returns a bool indicating if the Segment contains the provided ID.
ContainsID(docID []byte) (bool, error)
// ContainsField returns a bool indicating if the Segment contains the provided field.
ContainsField(field []byte) (bool, error)
// Reader returns a point-in-time accessor to search the segment.
Reader() (Reader, error)
// Close closes the segment and releases any internal resources.
Close() error
}
// Reader extends index reader interface to allow for reading
// of fields and terms.
type Reader interface {
index.Reader
FieldsIterable
TermsIterable
// ContainsField returns a bool indicating if the Segment contains the provided field.
ContainsField(field []byte) (bool, error)
}
// FieldsIterable can iterate over segment fields, it is not by default
// concurrency safe.
type FieldsIterable interface {
// Fields returns an iterator over the list of known fields, in order
// by name, it is not valid for reading after mutating the
// builder by inserting more documents.
Fields() (FieldsIterator, error)
}
// FieldsPostingsListIterable can iterate over segment fields/postings lists, it is not by default
// concurrency safe.
type FieldsPostingsListIterable interface {
// Fields returns an iterator over the list of known fields, in order
// by name, it is not valid for reading after mutating the
// builder by inserting more documents.
FieldsPostingsList() (FieldsPostingsListIterator, error)
}
// TermsIterable can iterate over segment terms, it is not by default
// concurrency safe.
type TermsIterable interface {
// Terms returns an iterator over the known terms values for the given
// field, in order by name, it is not valid for reading after mutating the
// builder by inserting more documents.
Terms(field []byte) (TermsIterator, error)
}
// OrderedBytesIterator iterates over a collection of []bytes in lexicographical order.
type OrderedBytesIterator interface {
// Next returns a bool indicating if there are any more elements.
Next() bool
// Current returns the current element.
// NB: the element returned is only valid until the subsequent call to Next().
Current() []byte
// Err returns any errors encountered during iteration.
Err() error
// Close releases any resources held by the iterator.
Close() error
}
// FieldsPostingsListIterator iterates over all known fields.
type FieldsPostingsListIterator interface {
Iterator
// Current returns the current field and associated postings list.
// NB: the field returned is only valid until the subsequent call to Next().
Current() ([]byte, postings.List)
}
// FieldsIterator iterates over all known fields.
type FieldsIterator interface {
Iterator
// Current returns the current field.
// NB: the field returned is only valid until the subsequent call to Next().
Current() []byte
}
// TermsIterator iterates over all known terms for the provided field.
type TermsIterator interface {
Iterator
// Current returns the current element.
// NB: the element returned is only valid until the subsequent call to Next().
Current() (term []byte, postings postings.List)
}
// Iterator holds common iterator methods.
type Iterator interface {
// Next returns a bool indicating if there are any more elements.
Next() bool
// Err returns any errors encountered during iteration.
Err() error
// Close releases any resources held by the iterator.
Close() error
}
// MutableSegment is a segment which can be updated.
type MutableSegment interface {
Segment
DocumentsBuilder
// Fields returns an iterator over the list of known fields, in order
// by name, it is not valid for reading after mutating the
// builder by inserting more documents.
Fields() (FieldsIterator, error)
// Offset returns the postings offset.
Offset() postings.ID
// Seal marks the Mutable Segment immutable.
Seal() error
// IsSealed returns true iff the segment is open and un-sealed.
IsSealed() bool
}
// ImmutableSegment is segment that has been written to disk.
type ImmutableSegment interface {
Segment
FreeMmap() error
}
// Builder is a builder that can be used to construct segments.
type Builder interface {
FieldsPostingsListIterable
TermsIterable
// Reset resets the builder for reuse.
Reset(offset postings.ID)
// Docs returns the current docs slice, this is not safe to modify
// and is invalidated on a call to reset.
Docs() []doc.Document
// AllDocs returns an iterator over the documents known to the Reader.
AllDocs() (index.IDDocIterator, error)
}
// DocumentsBuilder is a builder that has documents written to it.
type DocumentsBuilder interface {
Builder
index.Writer
// SetIndexConcurrency sets the concurrency used for building the segment.
SetIndexConcurrency(value int)
// IndexConcurrency returns the concurrency used for building the segment.
IndexConcurrency() int
}
// CloseableDocumentsBuilder is a builder that has documents written to it and has freeable resources.
type CloseableDocumentsBuilder interface {
DocumentsBuilder
Close() error
}
// SegmentsBuilder is a builder that is built from segments.
type SegmentsBuilder interface {
Builder
// AddSegments adds segments to build from.
AddSegments(segments []Segment) error
}