blob: 9907fd46ffcab7ee5ccce15eff9347156dca01e3 (
plain) (
blame)
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
|
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
#include "resultnode.h"
#include <vespa/searchcommon/attribute/iattributevector.h>
namespace search::expression {
class AttributeResult : public ResultNode
{
public:
using UP = std::unique_ptr<AttributeResult>;
DECLARE_RESULTNODE(AttributeResult);
AttributeResult() : _attribute(nullptr), _docId(0) { }
AttributeResult(const attribute::IAttributeVector * attribute, DocId docId)
: _attribute(attribute),
_docId(docId)
{ }
void setDocId(DocId docId) { _docId = docId; }
const search::attribute::IAttributeVector *getAttribute() const { return _attribute; }
DocId getDocId() const { return _docId; }
protected:
ConstBufferRef get_raw() const {
auto raw = getAttribute()->get_raw(_docId);
return {raw.data(), raw.size()};
}
private:
int64_t onGetInteger(size_t index) const override { (void) index; return _attribute->getInt(_docId); }
double onGetFloat(size_t index) const override { (void) index; return _attribute->getFloat(_docId); }
ConstBufferRef onGetString(size_t, BufferRef) const override {
return get_raw();
}
int64_t onGetEnum(size_t index) const override { (void) index; return (static_cast<int64_t>(_attribute->getEnum(_docId))); }
void set(const search::expression::ResultNode&) override { }
size_t hash() const override { return _docId; }
const search::attribute::IAttributeVector *_attribute;
DocId _docId;
};
class IntegerAttributeResult : public AttributeResult {
public:
DECLARE_RESULTNODE(IntegerAttributeResult);
IntegerAttributeResult() : AttributeResult() {}
IntegerAttributeResult(const attribute::IAttributeVector * attribute, DocId docId)
: AttributeResult(attribute, docId)
{ }
ConstBufferRef onGetString(size_t index, BufferRef buf) const override;
};
class FloatAttributeResult : public AttributeResult {
public:
DECLARE_RESULTNODE(FloatAttributeResult);
FloatAttributeResult() : AttributeResult() {}
FloatAttributeResult(const attribute::IAttributeVector * attribute, DocId docId)
: AttributeResult(attribute, docId)
{ }
ConstBufferRef onGetString(size_t index, BufferRef buf) const override;
};
}
|