|
- // Copyright (c) 2015 Couchbase, Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package index
-
- import (
- "reflect"
-
- "github.com/blevesearch/bleve/analysis"
- "github.com/blevesearch/bleve/document"
- "github.com/blevesearch/bleve/size"
- )
-
- var reflectStaticSizeAnalysisResult int
-
- func init() {
- var ar AnalysisResult
- reflectStaticSizeAnalysisResult = int(reflect.TypeOf(ar).Size())
- }
-
- type IndexRow interface {
- KeySize() int
- KeyTo([]byte) (int, error)
- Key() []byte
-
- ValueSize() int
- ValueTo([]byte) (int, error)
- Value() []byte
- }
-
- type AnalysisResult struct {
- DocID string
- Rows []IndexRow
-
- // scorch
- Document *document.Document
- Analyzed []analysis.TokenFrequencies
- Length []int
- }
-
- func (a *AnalysisResult) Size() int {
- rv := reflectStaticSizeAnalysisResult
- for _, analyzedI := range a.Analyzed {
- rv += analyzedI.Size()
- }
- rv += len(a.Length) * size.SizeOfInt
- return rv
- }
-
- type AnalysisWork struct {
- i Index
- d *document.Document
- rc chan *AnalysisResult
- }
-
- func NewAnalysisWork(i Index, d *document.Document, rc chan *AnalysisResult) *AnalysisWork {
- return &AnalysisWork{
- i: i,
- d: d,
- rc: rc,
- }
- }
-
- type AnalysisQueue struct {
- queue chan *AnalysisWork
- done chan struct{}
- }
-
- func (q *AnalysisQueue) Queue(work *AnalysisWork) {
- q.queue <- work
- }
-
- func (q *AnalysisQueue) Close() {
- close(q.done)
- }
-
- func NewAnalysisQueue(numWorkers int) *AnalysisQueue {
- rv := AnalysisQueue{
- queue: make(chan *AnalysisWork),
- done: make(chan struct{}),
- }
- for i := 0; i < numWorkers; i++ {
- go AnalysisWorker(rv)
- }
- return &rv
- }
-
- func AnalysisWorker(q AnalysisQueue) {
- // read work off the queue
- for {
- select {
- case <-q.done:
- return
- case w := <-q.queue:
- r := w.i.Analyze(w.d)
- w.rc <- r
- }
- }
- }
|