package engine

import (
    "github.com/huichen/wukong/types"
    "sync/atomic"
)

type indexerAddDocumentRequest struct {
    document    *types.DocumentIndex
    forceUpdate bool
}

type indexerLookupRequest struct {
    countDocsOnly       bool
    tokens              []string
    labels              []string
    docIds              map[uint64]bool
    options             types.RankOptions
    rankerReturnChannel chan rankerReturnRequest
    orderless           bool
}

type indexerRemoveDocRequest struct {
    docId       uint64
    forceUpdate bool
}

func (engine *Engine) indexerAddDocumentWorker(shard int) {
    for {
        request := <-engine.indexerAddDocChannels[shard]
        engine.indexers[shard].AddDocumentToCache(request.document, request.forceUpdate)
        if request.document != nil {
            atomic.AddUint64(&engine.numTokenIndexAdded,
                uint64(len(request.document.Keywords)))
            atomic.AddUint64(&engine.numDocumentsIndexed, 1)
        }
        if request.forceUpdate {
            atomic.AddUint64(&engine.numDocumentsForceUpdated, 1)
        }
    }
}

func (engine *Engine) indexerRemoveDocWorker(shard int) {
    for {
        request := <-engine.indexerRemoveDocChannels[shard]
        engine.indexers[shard].RemoveDocumentToCache(request.docId, request.forceUpdate)
        if request.docId != 0 {
            atomic.AddUint64(&engine.numDocumentsRemoved, 1)
        }
        if request.forceUpdate {
            atomic.AddUint64(&engine.numDocumentsForceUpdated, 1)
        }
    }
}

func (engine *Engine) indexerLookupWorker(shard int) {
    for {
        request := <-engine.indexerLookupChannels[shard]

        var docs []types.IndexedDocument
        var numDocs int
        if request.docIds == nil {
            docs, numDocs = engine.indexers[shard].Lookup(request.tokens, request.labels, nil, request.countDocsOnly)
        } else {
            docs, numDocs = engine.indexers[shard].Lookup(request.tokens, request.labels, request.docIds, request.countDocsOnly)
        }

        if request.countDocsOnly {
            request.rankerReturnChannel <- rankerReturnRequest{numDocs: numDocs}
            continue
        }

        if len(docs) == 0 {
            request.rankerReturnChannel <- rankerReturnRequest{}
            continue
        }

        if request.orderless {
            var outputDocs []types.ScoredDocument
            for _, d := range docs {
                outputDocs = append(outputDocs, types.ScoredDocument{
                    DocId: d.DocId,
                    TokenSnippetLocations: d.TokenSnippetLocations,
                    TokenLocations:        d.TokenLocations})
            }
            request.rankerReturnChannel <- rankerReturnRequest{
                docs:    outputDocs,
                numDocs: len(outputDocs),
            }
            continue
        }

        rankerRequest := rankerRankRequest{
            countDocsOnly:       request.countDocsOnly,
            docs:                docs,
            options:             request.options,
            rankerReturnChannel: request.rankerReturnChannel,
        }
        engine.rankerRankChannels[shard] <- rankerRequest
    }
}

indexer_worker.go的更多相关文章

随机推荐

  1. SpringBoot2.0之二 新建RESTfull风格项目

    1.新建一个Maven项目(具体方法可以参照 SpringBoot之一) 2.先建一个User类 package com.somta.springboot.pojo; public class Use ...

  2. mysql 2003错误

    mysql安装好经常发现无法正常启动碰到最多的是error 2003的错误,以下为解决方法: mysqld -nt -remove mysqld -nt -install 重新启动mysql net ...

  3. java向上转型和向下转型1

    在java继承体系中,认为父类(超类)在上层,子类在下层(派生类) ,向上转型就是把子类对象转成父类对象. public class Father { public void eat(){ Syste ...

  4. majority element(数组中找出出现次数最多的元素)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  5. Spring 框架的优点及缺点

    首先Spring 是一个框架,使用Spring并不代表代码质量的提高,就像盖房子选择用上海的地皮还是北京的地皮一样,房子质量与土地所在的城市无关,与房子的具体设计方案和选料有关. 使用Spring 等 ...

  6. java之Hibernate框架实现数据库操作

    之前我们用一个java类连接MySQL数据库实现了数据库的增删改查操作---------MySQL篇: 但是数据库种类之多,除了MySQL,还有Access.Oracle.DB2等等,而且每种数据库语 ...

  7. leetCode刷题(找到最长的连续不重复的字符串长度)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  8. Linux(二十二)Ubuntu安装和配置

    Ubuntu的介绍 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化的专业开发团队(Ca ...

  9. Vimium快捷键记录

    作为一个Geek必备的技能 从今天起在这里仅记录下使用过的快捷键和心得(翻译自 ?) version: 1.59 版本不同,快捷键有所不同 1. 下载安装地址(自备梯子) Chrome商店:https ...

  10. linux下c编程 基础

    1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...