// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace proton::matching { class ViewResolver; class ProtonTermData : public search::fef::ITermData { public: typedef search::queryeval::FieldSpec FieldSpec; struct FieldEntry final : search::fef::SimpleTermFieldData { vespalib::string field_name; bool attribute_field; bool filter_field; FieldEntry(const vespalib::string &name, uint32_t fieldId) : SimpleTermFieldData(fieldId), field_name(name), attribute_field(false), filter_field(false) {} FieldSpec fieldSpec() const { return FieldSpec(field_name, getFieldId(), getHandle(), filter_field); } using SimpleTermFieldData::getHandle; search::fef::TermFieldHandle getHandle(search::fef::MatchDataDetails requested_details) const override; }; private: std::vector _fields; void propagate_document_frequency(uint32_t matching_count_doc, uint32_t total_doc_count); protected: void resolve(const ViewResolver &resolver, const search::fef::IIndexEnvironment &idxEnv, const vespalib::string &view, bool forceFilter); public: ProtonTermData(); ProtonTermData(const ProtonTermData &); ProtonTermData & operator = (const ProtonTermData &); ProtonTermData(ProtonTermData &&) = default; ProtonTermData & operator = (ProtonTermData &&) = default; ~ProtonTermData(); void resolveFromChildren(const std::vector &children); void allocateTerms(search::fef::MatchDataLayout &mdl); void setDocumentFrequency(uint32_t estHits, uint32_t numDocs); // ITermData interface size_t numFields() const override final { return _fields.size(); } const FieldEntry &field(size_t i) const override final { return _fields[i]; } const FieldEntry *lookupField(uint32_t fieldId) const override final; }; template inline uint32_t numTerms(const NodeType &) { return 1; } template <> inline uint32_t numTerms(const search::query::Phrase &n) { return n.getChildren().size(); } template struct ProtonTermBase : public Base, public ProtonTermData { using Base::Base; void resolve(const ViewResolver &resolver, const search::fef::IIndexEnvironment &idxEnv) { bool forceFilter = !Base::usePositionData(); ProtonTermData::resolve(resolver, idxEnv, Base::getView(), forceFilter); } // ITermData interface uint32_t getPhraseLength() const override final { return numTerms(*this); } search::query::Weight getWeight() const override final { return Base::getWeight(); } uint32_t getUniqueId() const override final { return Base::getId(); } }; template struct ProtonTerm final : public ProtonTermBase { using ProtonTermBase::ProtonTermBase; ~ProtonTerm(); }; template ProtonTerm::~ProtonTerm() = default; typedef search::query::SimpleAnd ProtonAnd; typedef search::query::SimpleAndNot ProtonAndNot; typedef search::query::SimpleNear ProtonNear; typedef search::query::SimpleONear ProtonONear; typedef search::query::SimpleOr ProtonOr; typedef search::query::SimpleRank ProtonRank; typedef search::query::SimpleWeakAnd ProtonWeakAnd; typedef search::query::SimpleSameElement ProtonSameElement; typedef search::query::SimpleTrue ProtonTrue; typedef search::query::SimpleFalse ProtonFalse; struct ProtonEquiv final : public ProtonTermBase { search::fef::MatchDataLayout children_mdl; using ProtonTermBase::ProtonTermBase; }; typedef ProtonTerm ProtonLocationTerm; typedef ProtonTerm ProtonNumberTerm; typedef ProtonTerm ProtonPhrase; typedef ProtonTerm ProtonPrefixTerm; typedef ProtonTerm ProtonRangeTerm; typedef ProtonTerm ProtonStringTerm; typedef ProtonTerm ProtonSubstringTerm; typedef ProtonTerm ProtonSuffixTerm; typedef ProtonTerm ProtonWeightedSetTerm; typedef ProtonTerm ProtonDotProduct; typedef ProtonTerm ProtonWandTerm; typedef ProtonTerm ProtonPredicateQuery; typedef ProtonTerm ProtonRegExpTerm; typedef ProtonTerm ProtonNearestNeighborTerm; struct ProtonNodeTypes { typedef ProtonAnd And; typedef ProtonAndNot AndNot; typedef ProtonEquiv Equiv; typedef ProtonLocationTerm LocationTerm; typedef ProtonNear Near; typedef ProtonNumberTerm NumberTerm; typedef ProtonONear ONear; typedef ProtonOr Or; typedef ProtonPhrase Phrase; typedef ProtonSameElement SameElement; typedef ProtonPrefixTerm PrefixTerm; typedef ProtonRangeTerm RangeTerm; typedef ProtonRank Rank; typedef ProtonStringTerm StringTerm; typedef ProtonSubstringTerm SubstringTerm; typedef ProtonSuffixTerm SuffixTerm; typedef ProtonWeakAnd WeakAnd; typedef ProtonWeightedSetTerm WeightedSetTerm; typedef ProtonDotProduct DotProduct; typedef ProtonWandTerm WandTerm; typedef ProtonPredicateQuery PredicateQuery; typedef ProtonRegExpTerm RegExpTerm; typedef ProtonNearestNeighborTerm NearestNeighborTerm; typedef ProtonTrue TrueQueryNode; typedef ProtonFalse FalseQueryNode; }; }