aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/expression/stringbucketresultnode.cpp
blob: 5aadddfa0e20f3cca90d6a3680a53ad7365772af (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
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
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "stringbucketresultnode.h"
#include <vespa/vespalib/objects/visit.hpp>

namespace search::expression {

IMPLEMENT_RESULTNODE(StringBucketResultNode, BucketResultNode);

StringBucketResultNode StringBucketResultNode::_nullResult;

StringBucketResultNode::StringBucketResultNode(const StringBucketResultNode&) = default;

StringBucketResultNode& StringBucketResultNode::operator=(const StringBucketResultNode&) = default;

StringBucketResultNode& StringBucketResultNode::operator=(StringBucketResultNode&&) = default;

size_t
StringBucketResultNode::hash() const
{
#if 0
    union {
        uint8_t  cxor[8];
        uint64_t ixor;
    } xorResult;
    xorResult.ixor = 0;
    size_t i(0);
    const size_t m(_from.size());
    const char * c = _from.c_str();
    const uint64_t * ic = reinterpret_cast<const uint64_t *>(c);
    for (; i+8 < m; i+=8) {
        const size_t index(i/8);
        xorResult.ixor ^= ic[index];
    }
    for (; i < m; i++) {
        xorResult.cxor[i%8] ^= c[i];
    }
    return xorResult.ixor;
#else
    return 0;
#endif
}

StringBucketResultNode::StringBucketResultNode()
    : _from(new StringResultNode()),
      _to(new StringResultNode())
{}
StringBucketResultNode::StringBucketResultNode(vespalib::stringref from, vespalib::stringref to)
    : _from(new StringResultNode(from)),
      _to(new StringResultNode(to))
{}
StringBucketResultNode::~StringBucketResultNode() = default;

int
StringBucketResultNode::onCmp(const Identifiable & rhs) const
{
    const StringBucketResultNode & b = static_cast<const StringBucketResultNode &>(rhs);
    int diff(_from->cmp(*b._from));
    return (diff == 0) ? _to->cmp(*b._to) : diff;
}

int StringBucketResultNode::contains(const StringBucketResultNode & b) const
{
    int fromDiff(_from->cmp(*b._from));
    int toDiff(_to->cmp(*b._to));
    return (fromDiff < 0) ? std::min(0, toDiff) : std::max(0, toDiff);
}

int StringBucketResultNode::contains(const char * s) const
{
    StringResultNode v(s);
    int diff(_from->cmp(v));
    if (diff > 0) {
        return 1;
    } else {
        diff = _to->cmp(v);
        return (diff <= 0) ? -1 : 0;
    }
}

void
StringBucketResultNode::visitMembers(vespalib::ObjectVisitor &visitor) const
{
    visit(visitor, _fromField, _from);
    visit(visitor, _toField, _to);
}

vespalib::Serializer &
StringBucketResultNode::onSerialize(vespalib::Serializer & os) const
{
    _from.serialize(os);
    _to.serialize(os);
    return os;
}

vespalib::Deserializer &
StringBucketResultNode::onDeserialize(vespalib::Deserializer & is)
{
    _from.deserialize(is);
    _to.deserialize(is);
    return is;
}

}

// this function was added by ../../forcelink.sh
void forcelink_file_searchlib_expression_stringbucketresultnode() {}