diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-02-12 16:22:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-12 16:22:55 +0100 |
commit | c30218b738febd3e4f00392a0e0eaf1b6354e90d (patch) | |
tree | be801409f65cc7811bb1c334c73f0803a63f0354 | |
parent | ab2e746543da87d457efd5029ae1b6cdca311fc1 (diff) | |
parent | 9bf43297fe60aaffc0e2334b39ffb2f57294adb6 (diff) |
Merge branch 'master' into balder/use-wanted-hitcount
27 files changed, 178 insertions, 203 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java index 5f5f8266ab0..20d32650f45 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java @@ -66,7 +66,6 @@ class HitConverter implements ResultBuilder.HitConverter { defs.lazyDecode(summaryClass, grpHit.getSummary().getData(), hit); hit.setField(Hit.SDDOCNAME_FIELD, hitContext.getSchema().name()); hit.setFilled(summaryClass); - hit.setFilled(hitContext.getQuery().getPresentation().getSummary()); hit.setQuery(hitContext.getQuery()); } return hit; diff --git a/document/src/main/java/com/yahoo/document/update/TensorModifyUpdate.java b/document/src/main/java/com/yahoo/document/update/TensorModifyUpdate.java index 7e15a729684..8d42438e931 100644 --- a/document/src/main/java/com/yahoo/document/update/TensorModifyUpdate.java +++ b/document/src/main/java/com/yahoo/document/update/TensorModifyUpdate.java @@ -119,7 +119,7 @@ public class TensorModifyUpdate extends ValueUpdate<TensorFieldValue> { for (int i = 0; i < type.dimensions().size(); ++i) { var dim = type.dimensions().get(i); if (dim.isMapped()) { - builder.add(dim.name(), (int) address.numericLabel(i)); + builder.add(dim.name(), address.numericLabel(i)); } } return builder.build(); diff --git a/metrics/src/main/java/ai/vespa/metrics/HostedNodeAdminMetrics.java b/metrics/src/main/java/ai/vespa/metrics/HostedNodeAdminMetrics.java index 35e9930230f..857d59f50eb 100644 --- a/metrics/src/main/java/ai/vespa/metrics/HostedNodeAdminMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/HostedNodeAdminMetrics.java @@ -7,6 +7,7 @@ package ai.vespa.metrics; // TODO: Move to hosted repo. public enum HostedNodeAdminMetrics implements VespaMetrics { + COREDUMPS_PROCESSED("coredumps.processed", Unit.OPERATION, "Number of coredumps processed"), // System metrics CPU_UTIL("cpu.util", Unit.PERCENTAGE, "CPU utilisation"), diff --git a/metrics/src/main/java/ai/vespa/metrics/set/Vespa9DefaultMetricSet.java b/metrics/src/main/java/ai/vespa/metrics/set/Vespa9DefaultMetricSet.java index 7111fb1285e..169c9ee5346 100644 --- a/metrics/src/main/java/ai/vespa/metrics/set/Vespa9DefaultMetricSet.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/Vespa9DefaultMetricSet.java @@ -7,6 +7,7 @@ package ai.vespa.metrics.set; import ai.vespa.metrics.ClusterControllerMetrics; import ai.vespa.metrics.ContainerMetrics; import ai.vespa.metrics.DistributorMetrics; +import ai.vespa.metrics.LogdMetrics; import ai.vespa.metrics.NodeAdminMetrics; import ai.vespa.metrics.SearchNodeMetrics; import ai.vespa.metrics.SentinelMetrics; @@ -164,6 +165,8 @@ public class Vespa9DefaultMetricSet { private static MetricSet getOtherMetrics() { // Metrics needed for alerting return new MetricSet.Builder("default-other") + .metric(LogdMetrics.LOGD_PROCESSED_LINES.count()) + .metric(NodeAdminMetrics.ENDPOINT_CERTIFICATE_EXPIRY_SECONDS.baseName()) .metric(NodeAdminMetrics.NODE_CERTIFICATE_EXPIRY_SECONDS.baseName()) .build(); diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/UnpackBitsNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/UnpackBitsNode.java index ed672c2dcd7..81ad09dd880 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/UnpackBitsNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/UnpackBitsNode.java @@ -121,7 +121,7 @@ public class UnpackBitsNode extends CompositeNode { long newIdx = oldAddr.numericLabel(i) * 8 + bitIdx; addrBuilder.add(dim.name(), newIdx); } else { - addrBuilder.add(dim.name(), (int) oldAddr.numericLabel(i)); + addrBuilder.add(dim.name(), oldAddr.numericLabel(i)); } } var newAddr = addrBuilder.build(); diff --git a/searchlib/src/vespa/searchlib/aggregation/hitsaggregationresult.h b/searchlib/src/vespa/searchlib/aggregation/hitsaggregationresult.h index 0bf33ea33e8..f90ee3c2312 100644 --- a/searchlib/src/vespa/searchlib/aggregation/hitsaggregationresult.h +++ b/searchlib/src/vespa/searchlib/aggregation/hitsaggregationresult.h @@ -16,8 +16,8 @@ public: class SummaryGenerator { public: - virtual ~SummaryGenerator() { } - virtual vespalib::ConstBufferRef fillSummary(DocId lid, const SummaryClassType & summaryClass) = 0; + virtual ~SummaryGenerator() = default; + virtual vespalib::ConstBufferRef fillSummary(DocId lid, vespalib::stringref summaryClass) = 0; }; private: @@ -26,7 +26,7 @@ private: void onAggregate(const ResultNode &result, const document::Document & doc, HitRank rank) override; const ResultNode & onGetRank() const override; - SummaryClassType _summaryClass; + vespalib::string _summaryClass; uint32_t _maxHits; HitList _hits; bool _isOrdered; @@ -50,8 +50,8 @@ public: ~HitsAggregationResult() override; void postMerge() override { _hits.postMerge(_maxHits); } void setSummaryGenerator(SummaryGenerator & summaryGenerator) { _summaryGenerator = &summaryGenerator; } - const SummaryClassType & getSummaryClass() const { return _summaryClass; } - HitsAggregationResult setSummaryClass(const SummaryClassType & summaryClass) { _summaryClass = summaryClass; return *this; } + const vespalib::string & getSummaryClass() const { return _summaryClass; } + HitsAggregationResult setSummaryClass(vespalib::stringref summaryClass) { _summaryClass = summaryClass; return *this; } HitsAggregationResult &setMaxHits(uint32_t maxHits) { _maxHits = (maxHits == 0) ? std::numeric_limits<uint32_t>::max() : maxHits; return *this; diff --git a/searchlib/src/vespa/searchlib/aggregation/vdshit.h b/searchlib/src/vespa/searchlib/aggregation/vdshit.h index 11cfe9b3b18..32a35c22977 100644 --- a/searchlib/src/vespa/searchlib/aggregation/vdshit.h +++ b/searchlib/src/vespa/searchlib/aggregation/vdshit.h @@ -2,7 +2,6 @@ #pragma once #include "hit.h" -#include "aggregationresult.h" namespace search::aggregation { @@ -10,19 +9,18 @@ class VdsHit : public Hit { public: using Summary = std::vector<uint8_t>; - using DocId = vespalib::string; DECLARE_IDENTIFIABLE_NS2(search, aggregation, VdsHit); DECLARE_NBO_SERIALIZE; VdsHit() noexcept : Hit(), _docId(), _summary() {} - VdsHit(DocId docId, HitRank rank) noexcept : Hit(rank), _docId(docId), _summary() {} - ~VdsHit(); + VdsHit(vespalib::stringref docId, HitRank rank) noexcept : Hit(rank), _docId(docId), _summary() {} + ~VdsHit() override; VdsHit *clone() const override { return new VdsHit(*this); } void visitMembers(vespalib::ObjectVisitor &visitor) const override; - const DocId & getDocId() const noexcept { return _docId; } + const vespalib::string & getDocId() const noexcept { return _docId; } const Summary & getSummary() const noexcept { return _summary; } - VdsHit & setDocId(DocId & docId) noexcept { _docId = docId; return *this; } + VdsHit & setDocId(vespalib::stringref docId) noexcept { _docId = docId; return *this; } VdsHit & setSummary(const void * buf, size_t sz) noexcept { - const uint8_t * v(static_cast<const uint8_t *>(buf)); + const auto * v(static_cast<const uint8_t *>(buf)); Summary n(v, v+sz); _summary.swap(n); return *this; @@ -30,8 +28,8 @@ public: bool operator < (const VdsHit &b) const noexcept { return cmp(b) < 0; } private: - DocId _docId; - Summary _summary; + vespalib::string _docId; + Summary _summary; }; } diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp index 26ff6a0dcf9..cbb001c6e07 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp @@ -17,13 +17,11 @@ class DatWriter { std::unique_ptr<search::BufferWriter> _datWriter; public: - DatWriter(IAttributeSaveTarget &saveTarget) + explicit DatWriter(IAttributeSaveTarget &saveTarget) : _datWriter(saveTarget.datWriter().allocBufferWriter()) - { - } + { } - ~DatWriter() - { + ~DatWriter() { _datWriter->flush(); } @@ -53,15 +51,11 @@ MultiValueNumericAttributeSaver(GenerationHandler::Guard &&guard, template <typename MultiValueT> -MultiValueNumericAttributeSaver<MultiValueT>:: -~MultiValueNumericAttributeSaver() -{ -} +MultiValueNumericAttributeSaver<MultiValueT>::~MultiValueNumericAttributeSaver() = default; template <typename MultiValueT> bool -MultiValueNumericAttributeSaver<MultiValueT>:: -onSave(IAttributeSaveTarget &saveTarget) +MultiValueNumericAttributeSaver<MultiValueT>::onSave(IAttributeSaveTarget &saveTarget) { CountWriter countWriter(saveTarget); WeightWriter<multivalue::is_WeightedValue_v<MultiValueType>> weightWriter(saveTarget); diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h index c0bffca8408..240c75bfc42 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h @@ -26,12 +26,12 @@ class MultiValueNumericAttributeSaver : public MultiValueAttributeSaver const MultiValueMapping &_mvMapping; public: - virtual bool onSave(IAttributeSaveTarget &saveTarget) override; + bool onSave(IAttributeSaveTarget &saveTarget) override; MultiValueNumericAttributeSaver(GenerationHandler::Guard &&guard, const attribute::AttributeHeader &header, const MultiValueMapping &mvMapping); - virtual ~MultiValueNumericAttributeSaver(); + ~MultiValueNumericAttributeSaver() override; }; diff --git a/searchlib/src/vespa/searchlib/index/indexbuilder.h b/searchlib/src/vespa/searchlib/index/indexbuilder.h index 9615bfd9428..71b826698ef 100644 --- a/searchlib/src/vespa/searchlib/index/indexbuilder.h +++ b/searchlib/src/vespa/searchlib/index/indexbuilder.h @@ -10,6 +10,13 @@ class DocIdAndFeatures; class Schema; class WordDocElementWordPosFeatures; +/** + * Interface for building an index for a single field + * The index should be built as follows: + * Add the set of unique words in sorted order. + * For each word add the set of document ids in sorted order. + * For each document id add the position information for that document. + */ class FieldIndexBuilder { public: virtual ~FieldIndexBuilder() = default; @@ -20,16 +27,11 @@ public: /** * Interface used to build an index for the set of index fields specified in a schema. - * - * The index should be built as follows: - * For each field add the set of unique words in sorted order. - * For each word add the set of document ids in sorted order. - * For each document id add the position information for that document. + * Create and complete one field builder at the time. */ class IndexBuilder { protected: const Schema &_schema; - public: explicit IndexBuilder(const Schema &schema); virtual ~IndexBuilder(); diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp index 71c8d173ccb..e1ee72b0152 100644 --- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp @@ -5,13 +5,10 @@ #include <vespa/searchlib/fef/utils.h> #include <vespa/vespalib/util/stringfmt.h> #include <algorithm> -#include <vespa/eval/eval/value_codec.h> -#include <vespa/vespalib/objects/nbostream.h> #include <vespa/log/log.h> LOG_SETUP(".searchvisitor.hitcollector"); -using search::fef::MatchData; using vespalib::FeatureSet; using vespalib::FeatureValues; using vdslib::SearchResult; @@ -20,7 +17,7 @@ using FefUtils = search::fef::Utils; namespace streaming { -HitCollector::Hit::Hit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & matchData, +HitCollector::Hit::Hit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & matchData, double score, const void * sortData, size_t sortDataLen) : _docid(docId), _score(score), @@ -34,7 +31,7 @@ HitCollector::Hit::Hit(const vsm::StorageDocument * doc, uint32_t docId, const } } -HitCollector::Hit::~Hit() { } +HitCollector::Hit::~Hit() = default; HitCollector::HitCollector(size_t wantedHits, bool use_sort_blob) : _hits(), @@ -56,13 +53,13 @@ HitCollector::getDocSum(const search::DocumentIdT & docId) const } bool -HitCollector::addHit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & data, double score) +HitCollector::addHit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & data, double score) { return addHit(Hit(doc, docId, data, score)); } bool -HitCollector::addHit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & data, +HitCollector::addHit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & data, double score, const void * sortData, size_t sortDataLen) { return addHit(Hit(doc, docId, data, score, sortData, sortDataLen)); @@ -170,7 +167,7 @@ HitCollector::fillSearchResult(vdslib::SearchResult & searchResult) FeatureSet::SP HitCollector::getFeatureSet(IRankProgram &rankProgram, - const search::fef::FeatureResolver &resolver, + const FeatureResolver &resolver, const search::StringStringMap &feature_rename_map) { if (resolver.num_features() == 0 || _hits.empty()) { @@ -190,7 +187,7 @@ HitCollector::getFeatureSet(IRankProgram &rankProgram, FeatureValues HitCollector::get_match_features(IRankProgram& rank_program, - const search::fef::FeatureResolver& resolver, + const FeatureResolver& resolver, const search::StringStringMap& feature_rename_map) { FeatureValues match_features; diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h index d9ec8511ee3..50a233bfcef 100644 --- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h +++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h @@ -10,7 +10,7 @@ #include <vespa/vespalib/stllike/string.h> #include <vespa/vespalib/util/featureset.h> -namespace search { namespace fef { class FeatureResolver; } } +namespace search::fef { class FeatureResolver; } namespace streaming { @@ -20,54 +20,55 @@ namespace streaming { class HitCollector : public vsm::IDocSumCache { private: + using TermFieldMatchData = search::fef::TermFieldMatchData; + using MatchData = search::fef::MatchData; + using FeatureResolver = search::fef::FeatureResolver; class Hit { public: - Hit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & matchData, + Hit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & matchData, double score, const void * sortData, size_t sortDataLen); - Hit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & matchData, double score) + Hit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & matchData, double score) : Hit(doc, docId, matchData, score, nullptr, 0) { } ~Hit(); Hit(const Hit &) = delete; Hit & operator = (const Hit &) = delete; - Hit(Hit && rhs) = default; - Hit & operator = (Hit && rhs) = default; - search::DocumentIdT getDocId() const { return _docid; } - const vsm::StorageDocument & getDocument() const { return *_document; } - const std::vector<search::fef::TermFieldMatchData> &getMatchData() const { return _matchData; } - search::feature_t getRankScore() const { return _score; } - const vespalib::string & getSortBlob() const { return _sortBlob; } - bool operator < (const Hit & b) const { return getDocId() < b.getDocId(); } - int cmpDocId(const Hit & b) const { return getDocId() - b.getDocId(); } - int cmpRank(const Hit & b) const { + Hit(Hit && rhs) noexcept = default; + Hit & operator = (Hit && rhs) noexcept = default; + search::DocumentIdT getDocId() const noexcept { return _docid; } + const vsm::StorageDocument & getDocument() const noexcept { return *_document; } + const std::vector<TermFieldMatchData> &getMatchData() const noexcept { return _matchData; } + search::feature_t getRankScore() const noexcept { return _score; } + const vespalib::string & getSortBlob() const noexcept { return _sortBlob; } + bool operator < (const Hit & b) const noexcept { return getDocId() < b.getDocId(); } + int cmpDocId(const Hit & b) const noexcept { return getDocId() - b.getDocId(); } + int cmpRank(const Hit & b) const noexcept { return (getRankScore() > b.getRankScore()) ? -1 : ((getRankScore() < b.getRankScore()) ? 1 : cmpDocId(b)); } - int cmpSort(const Hit & b) const { + int cmpSort(const Hit & b) const noexcept { int diff = _sortBlob.compare(b._sortBlob.c_str(), b._sortBlob.size()); return (diff == 0) ? cmpDocId(b) : diff; } class RankComparator { public: - RankComparator() {} - bool operator() (const Hit & lhs, const Hit & rhs) const { + bool operator() (const Hit & lhs, const Hit & rhs) const noexcept { return lhs.cmpRank(rhs) < 0; } }; class SortComparator { public: - SortComparator() {} - bool operator() (const Hit & lhs, const Hit & rhs) const { + bool operator() (const Hit & lhs, const Hit & rhs) const noexcept { return lhs.cmpSort(rhs) < 0; } }; private: uint32_t _docid; - double _score; + double _score; const vsm::StorageDocument * _document; - std::vector<search::fef::TermFieldMatchData> _matchData; + std::vector<TermFieldMatchData> _matchData; vespalib::string _sortBlob; }; using HitVector = std::vector<Hit>; @@ -86,8 +87,8 @@ public: using UP = std::unique_ptr<HitCollector>; struct IRankProgram { - virtual ~IRankProgram() {} - virtual void run(uint32_t docid, const std::vector<search::fef::TermFieldMatchData> &matchData) = 0; + virtual ~IRankProgram() = default; + virtual void run(uint32_t docid, const std::vector<TermFieldMatchData> &matchData) = 0; }; HitCollector(size_t wantedHits, bool use_sort_blob); @@ -104,7 +105,7 @@ public: * @param data The match data for the hit. * @return true if the document was added to the heap **/ - bool addHit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & data, double score); + bool addHit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & data, double score); /** * Adds a hit to this hit collector. @@ -118,7 +119,7 @@ public: * @param sortDataLen The length of the sortdata. * @return true if the document was added to the heap **/ - bool addHit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & data, + bool addHit(const vsm::StorageDocument * doc, uint32_t docId, const MatchData & data, double score, const void * sortData, size_t sortDataLen); /** @@ -138,13 +139,12 @@ public: * @param resolver feature resolver, gives feature names and values **/ vespalib::FeatureSet::SP getFeatureSet(IRankProgram &rankProgram, - const search::fef::FeatureResolver &resolver, + const FeatureResolver &resolver, const search::StringStringMap &feature_rename_map); vespalib::FeatureValues get_match_features(IRankProgram& rank_program, - const search::fef::FeatureResolver& resolver, + const FeatureResolver& resolver, const search::StringStringMap& feature_rename_map); }; } // namespace streaming - diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp index ff47b5cb9d4..6b1ce83ee6f 100644 --- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp @@ -247,7 +247,7 @@ FeatureSet::SP RankProcessor::calculateFeatureSet() { LOG(debug, "Calculate feature set"); - RankProgram &rankProgram = *(_summaryProgram.get() != nullptr ? _summaryProgram : _rankProgram); + RankProgram &rankProgram = *(_summaryProgram ? _summaryProgram : _rankProgram); search::fef::FeatureResolver resolver(rankProgram.get_seeds(false)); LOG(debug, "Feature handles: numNames(%ld)", resolver.num_features()); RankProgramWrapper wrapper(*_match_data); @@ -260,7 +260,7 @@ FeatureValues RankProcessor::calculate_match_features() { if (!_match_features_program) { - return FeatureValues(); + return {}; } RankProgramWrapper wrapper(*_match_data); search::fef::FeatureResolver resolver(_match_features_program->get_seeds(false)); @@ -284,7 +284,7 @@ void RankProcessor::unpack_match_data(uint32_t docid, MatchData &matchData, QueryWrapper& query) { for (auto& term : query.getTermList()) { - QueryTermData & qtd = static_cast<QueryTermData &>(term->getQueryItem()); + auto & qtd = static_cast<QueryTermData &>(term->getQueryItem()); const ITermData &td = qtd.getTermData(); term->unpack_match_data(docid, td, matchData); } diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp index dfdf5e923b4..b965a050067 100644 --- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp @@ -194,7 +194,7 @@ SearchVisitor::SummaryGenerator::SummaryGenerator(const search::IAttributeManage SearchVisitor::SummaryGenerator::~SummaryGenerator() = default; SearchVisitor::StreamingDocsumsState& -SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::string& summary_class) { +SearchVisitor::SummaryGenerator::get_streaming_docsums_state(vespalib::stringref summary_class) { auto itr = _docsum_states.find(summary_class); if (itr != _docsum_states.end()) { return *itr->second; @@ -224,7 +224,7 @@ SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::str } vespalib::ConstBufferRef -SearchVisitor::SummaryGenerator::fillSummary(AttributeVector::DocId lid, const HitsAggregationResult::SummaryClassType & summaryClass) +SearchVisitor::SummaryGenerator::fillSummary(AttributeVector::DocId lid, vespalib::stringref summaryClass) { if (_docsumWriter != nullptr) { vespalib::Slime slime; diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h index ae340f42622..dfd48736e89 100644 --- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h +++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h @@ -419,13 +419,13 @@ private: void setFilter(std::unique_ptr<vsm::DocsumFilter> filter) { _docsumFilter = std::move(filter); } void setDocsumCache(const vsm::IDocSumCache & cache) { _docsumFilter->setDocSumStore(cache); } void setDocsumWriter(IDocsumWriter & docsumWriter) { _docsumWriter = & docsumWriter; } - vespalib::ConstBufferRef fillSummary(search::AttributeVector::DocId lid, const HitsAggregationResult::SummaryClassType & summaryClass) override; + vespalib::ConstBufferRef fillSummary(search::AttributeVector::DocId lid, vespalib::stringref summaryClass) override; void set_dump_features(bool dump_features) { _dump_features = dump_features; } void set_location(const vespalib::string& location) { _location = location; } void set_stack_dump(std::vector<char> stack_dump) { _stack_dump = std::move(stack_dump); } void add_summary_field(vespalib::stringref field) { _summaryFields.emplace_back(field); } private: - StreamingDocsumsState& get_streaming_docsums_state(const vespalib::string& summary_class); + StreamingDocsumsState& get_streaming_docsums_state(vespalib::stringref summary_class); vsm::GetDocsumsStateCallback _callback; vespalib::hash_map<vespalib::string, std::unique_ptr<StreamingDocsumsState>> _docsum_states; std::vector<vespalib::string> _summaryFields; @@ -442,9 +442,9 @@ private: class HitsResultPreparator : public vespalib::ObjectOperation, public vespalib::ObjectPredicate { public: - explicit HitsResultPreparator(SummaryGenerator & summaryGenerator) : - _summaryGenerator(summaryGenerator), - _numHitsAggregators(0) + explicit HitsResultPreparator(SummaryGenerator & summaryGenerator) + : _summaryGenerator(summaryGenerator), + _numHitsAggregators(0) { } size_t getNumHitsAggregators() const { return _numHitsAggregators; } private: diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json index 7f77582ea81..754352a45a4 100644 --- a/vespajlib/abi-spec.json +++ b/vespajlib/abi-spec.json @@ -1281,8 +1281,8 @@ "public void <init>(com.yahoo.tensor.TensorType)", "public com.yahoo.tensor.TensorAddress$Builder add(java.lang.String)", "public com.yahoo.tensor.TensorAddress$Builder add(java.lang.String, java.lang.String)", - "public com.yahoo.tensor.TensorAddress$Builder add(java.lang.String, long)", "public com.yahoo.tensor.TensorAddress$Builder add(java.lang.String, int)", + "public com.yahoo.tensor.TensorAddress$Builder add(java.lang.String, long)", "public com.yahoo.tensor.TensorAddress$Builder copy()", "public com.yahoo.tensor.TensorType type()", "public com.yahoo.tensor.TensorAddress build()" diff --git a/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java b/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java index 4fa759668b6..cfa92719f0c 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java @@ -1,7 +1,6 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.tensor; -import com.yahoo.tensor.impl.Convert; import com.yahoo.tensor.impl.Label; import com.yahoo.tensor.impl.TensorAddressAny; @@ -105,16 +104,16 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { /** Returns an address with only some of the dimension. Ordering will also be according to indexMap */ public TensorAddress partialCopy(int[] indexMap) { - int[] labels = new int[indexMap.length]; + long[] labels = new long[indexMap.length]; for (int i = 0; i < labels.length; ++i) { - labels[i] = (int)numericLabel(indexMap[i]); + labels[i] = numericLabel(indexMap[i]); } return TensorAddressAny.ofUnsafe(labels); } /** Creates a complete address by taking the mapped dimmensions from this and the indexed from the indexedPart */ public TensorAddress fullAddressOf(List<TensorType.Dimension> dimensions, int[] densePart) { - int[] labels = new int[dimensions.size()]; + long[] labels = new long[dimensions.size()]; int mappedIndex = 0; int indexedIndex = 0; for (int i = 0; i < labels.length; i++) { @@ -123,7 +122,7 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { labels[i] = densePart[indexedIndex]; indexedIndex++; } else { - labels[i] = (int)numericLabel(mappedIndex); + labels[i] = numericLabel(mappedIndex); mappedIndex++; } } @@ -144,7 +143,7 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { for (int i = 0; i < dimensions.size(); ++i) { TensorType.Dimension dimension = dimensions.get(i); if ( ! dimension.isIndexed()) - builder.add(dimension.name(), (int)numericLabel(i)); + builder.add(dimension.name(), numericLabel(i)); } return builder.build(); } @@ -153,10 +152,10 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { public static class Builder { final TensorType type; - final int[] labels; + final long[] labels; - private static int[] createEmptyLabels(int size) { - int[] labels = new int[size]; + private static long[] createEmptyLabels(int size) { + long[] labels = new long[size]; Arrays.fill(labels, Tensor.invalidIndex); return labels; } @@ -165,7 +164,7 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { this(type, createEmptyLabels(type.dimensions().size())); } - private Builder(TensorType type, int[] labels) { + private Builder(TensorType type, long[] labels) { this.type = type; this.labels = labels; } @@ -199,10 +198,12 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { return this; } - public Builder add(String dimension, long label) { - return add(dimension, Convert.safe2Int(label)); - } + @Deprecated public Builder add(String dimension, int label) { + return add(dimension, (long) label); + } + + public Builder add(String dimension, long label) { Objects.requireNonNull(dimension, "dimension cannot be null"); int labelIndex = type.indexOfDimensionAsInt(dimension); if ( labelIndex < 0) @@ -240,7 +241,7 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { super(type); } - private PartialBuilder(TensorType type, int[] labels) { + private PartialBuilder(TensorType type, long[] labels) { super(type, labels); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Concat.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Concat.java index 9125b35ea5d..2635cbecb94 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Concat.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Concat.java @@ -355,16 +355,16 @@ public class Concat<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMET } TensorAddress combine(TensorAddress match, TensorAddress leftOnly, TensorAddress rightOnly, int concatDimIdx) { - int[] labels = new int[plan.resultType.rank()]; + long[] labels = new long[plan.resultType.rank()]; int out = 0; int m = 0; int a = 0; int b = 0; for (var how : plan.combineHow) { switch (how) { - case left -> labels[out++] = (int) leftOnly.numericLabel(a++); - case right -> labels[out++] = (int) rightOnly.numericLabel(b++); - case both -> labels[out++] = (int) match.numericLabel(m++); + case left -> labels[out++] = leftOnly.numericLabel(a++); + case right -> labels[out++] = rightOnly.numericLabel(b++); + case both -> labels[out++] = match.numericLabel(m++); case concat -> labels[out++] = concatDimIdx; default -> throw new IllegalArgumentException("cannot handle: " + how); } @@ -399,8 +399,8 @@ public class Concat<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMET CellVectorMapMap decompose(Tensor input, SplitHow how) { var iter = input.cellIterator(); - int[] commonLabels = new int[(int)how.numCommon()]; - int[] separateLabels = new int[(int)how.numSeparate()]; + long[] commonLabels = new long[(int)how.numCommon()]; + long[] separateLabels = new long[(int)how.numSeparate()]; CellVectorMapMap result = new CellVectorMapMap(); while (iter.hasNext()) { var cell = iter.next(); @@ -410,8 +410,8 @@ public class Concat<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMET int separateIdx = 0; for (int i = 0; i < how.handleDims.size(); i++) { switch (how.handleDims.get(i)) { - case common -> commonLabels[commonIdx++] = (int) addr.numericLabel(i); - case separate -> separateLabels[separateIdx++] = (int) addr.numericLabel(i); + case common -> commonLabels[commonIdx++] = addr.numericLabel(i); + case separate -> separateLabels[separateIdx++] = addr.numericLabel(i); case concat -> ccDimIndex = addr.numericLabel(i); default -> throw new IllegalArgumentException("cannot handle: " + how.handleDims.get(i)); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java index fb345264f56..9f6624752d1 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java @@ -12,7 +12,6 @@ import com.yahoo.tensor.TypeResolver; import com.yahoo.tensor.evaluation.EvaluationContext; import com.yahoo.tensor.evaluation.Name; import com.yahoo.tensor.evaluation.TypeContext; -import com.yahoo.tensor.impl.Convert; import com.yahoo.tensor.impl.TensorAddressAny; import java.util.ArrayList; @@ -377,7 +376,7 @@ public class Join<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETYP private static TensorAddress joinAddresses(TensorAddress a, int[] aToIndexes, TensorAddress b, int[] bToIndexes, TensorType joinedType) { - int[] joinedLabels = new int[joinedType.dimensions().size()]; + long[] joinedLabels = new long[joinedType.dimensions().size()]; Arrays.fill(joinedLabels, Tensor.invalidIndex); mapContent(a, joinedLabels, aToIndexes); boolean compatible = mapContent(b, joinedLabels, bToIndexes); @@ -391,10 +390,10 @@ public class Join<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETYP * @return true if the mapping was successful, false if one of the destination positions was * occupied by a different value */ - private static boolean mapContent(TensorAddress from, int[] to, int[] indexMap) { + private static boolean mapContent(TensorAddress from, long[] to, int[] indexMap) { for (int i = 0, size = from.size(); i < size; i++) { int toIndex = indexMap[i]; - int label = Convert.safe2Int(from.numericLabel(i)); + long label = from.numericLabel(i); if (to[toIndex] != Tensor.invalidIndex && to[toIndex] != label) return false; to[toIndex] = label; diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Slice.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Slice.java index 38ac42a5f1f..8f831611a0a 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Slice.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Slice.java @@ -52,7 +52,7 @@ public class Slice<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY public List<TensorFunction<NAMETYPE>> selectorFunctions() { var result = new ArrayList<TensorFunction<NAMETYPE>>(); for (var dimVal : subspaceAddress) { - dimVal.index().ifPresent(fun -> fun.asTensorFunction().ifPresent(tf -> result.add(tf))); + dimVal.index().flatMap(ScalarFunction::asTensorFunction).ifPresent(result::add); } return result; } @@ -131,7 +131,7 @@ public class Slice<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY for (int i = 0; i < address.size(); i++) { String dimension = type.dimensions().get(i).name(); if (subspaceType.dimension(type.dimensions().get(i).name()).isPresent()) - b.add(dimension, (int)address.numericLabel(i)); + b.add(dimension, address.numericLabel(i)); } return b.build(); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/Label.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/Label.java index 7c1e8646245..8933131fa53 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/Label.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/Label.java @@ -18,7 +18,7 @@ public class Label { private static final String[] SMALL_INDEXES = createSmallIndexesAsStrings(1000); - private final static Map<String, Integer> string2Enum = new ConcurrentHashMap<>(); + private final static Map<String, Long> string2Enum = new ConcurrentHashMap<>(); // Index 0 is unused, that is a valid positive number // 1(-1) is reserved for the Tensor.INVALID_INDEX @@ -33,7 +33,7 @@ public class Label { return asStrings; } - private static int addNewUniqueString(String s) { + private static long addNewUniqueString(String s) { synchronized (string2Enum) { if (numUniqeStrings >= uniqueStrings.length) { uniqueStrings = Arrays.copyOf(uniqueStrings, uniqueStrings.length*2); @@ -56,28 +56,25 @@ public class Label { return true; } - public static int toNumber(String s) { + public static long toNumber(String s) { if (s == null) { return Tensor.invalidIndex; } try { if (validNumericIndex(s)) { - return Integer.parseInt(s); + return Long.parseLong(s, 10); } } catch (NumberFormatException e) { } return string2Enum.computeIfAbsent(s, Label::addNewUniqueString); } - public static String fromNumber(int v) { + public static String fromNumber(long v) { if (v >= 0) { return asNumericString(v); } else { if (v == Tensor.invalidIndex) { return null; } - return uniqueStrings[-v]; + int index = -Convert.safe2Int(v); + return uniqueStrings[index]; } } - public static String fromNumber(long v) { - return fromNumber(Convert.safe2Int(v)); - } - } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny.java index 2e70811a67c..9003d263699 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny.java @@ -5,7 +5,8 @@ package com.yahoo.tensor.impl; import com.yahoo.tensor.Tensor; import com.yahoo.tensor.TensorAddress; -import static com.yahoo.tensor.impl.Convert.safe2Int; +import java.util.Arrays; + import static com.yahoo.tensor.impl.Label.toNumber; import static com.yahoo.tensor.impl.Label.fromNumber; @@ -21,7 +22,7 @@ abstract public class TensorAddressAny extends TensorAddress { @Override public String label(int i) { - return fromNumber((int)numericLabel(i)); + return fromNumber(numericLabel(i)); } public static TensorAddress of() { @@ -45,11 +46,11 @@ abstract public class TensorAddressAny extends TensorAddress { } public static TensorAddress of(String[] labels) { - int[] labelsAsInt = new int[labels.length]; + long[] labelsAsLong = new long[labels.length]; for (int i = 0; i < labels.length; i++) { - labelsAsInt[i] = toNumber(labels[i]); + labelsAsLong[i] = toNumber(labels[i]); } - return ofUnsafe(labelsAsInt); + return ofUnsafe(labelsAsLong); } public static TensorAddress of(int label) { @@ -71,80 +72,60 @@ abstract public class TensorAddressAny extends TensorAddress { public static TensorAddress of(int ... labels) { return switch (labels.length) { case 0 -> of(); - case 1 -> new TensorAddressAny1(sanitize(labels[0])); - case 2 -> new TensorAddressAny2(sanitize(labels[0]), sanitize(labels[1])); - case 3 -> new TensorAddressAny3(sanitize(labels[0]), sanitize(labels[1]), sanitize(labels[2])); - case 4 -> new TensorAddressAny4(sanitize(labels[0]), sanitize(labels[1]), sanitize(labels[2]), sanitize(labels[3])); + case 1 -> of(labels[0]); + case 2 -> of(labels[0], labels[1]); + case 3 -> of(labels[0], labels[1], labels[2]); + case 4 -> of(labels[0], labels[1], labels[2], labels[3]); default -> { + long[] copy = new long[labels.length]; for (int i = 0; i < labels.length; i++) { - sanitize(labels[i]); + copy[i] = sanitize(labels[i]); } - yield new TensorAddressAnyN(labels); + yield new TensorAddressAnyN(copy); } }; } - public static TensorAddress of(long label) { - return of(safe2Int(label)); - } - - public static TensorAddress of(long label0, long label1) { - return of(safe2Int(label0), safe2Int(label1)); - } - - public static TensorAddress of(long label0, long label1, long label2) { - return of(safe2Int(label0), safe2Int(label1), safe2Int(label2)); - } - - public static TensorAddress of(long label0, long label1, long label2, long label3) { - return of(safe2Int(label0), safe2Int(label1), safe2Int(label2), safe2Int(label3)); - } - public static TensorAddress of(long ... labels) { return switch (labels.length) { case 0 -> of(); - case 1 -> ofUnsafe(safe2Int(labels[0])); - case 2 -> ofUnsafe(safe2Int(labels[0]), safe2Int(labels[1])); - case 3 -> ofUnsafe(safe2Int(labels[0]), safe2Int(labels[1]), safe2Int(labels[2])); - case 4 -> ofUnsafe(safe2Int(labels[0]), safe2Int(labels[1]), safe2Int(labels[2]), safe2Int(labels[3])); - default -> { - int[] labelsAsInt = new int[labels.length]; - for (int i = 0; i < labels.length; i++) { - labelsAsInt[i] = safe2Int(labels[i]); - } - yield of(labelsAsInt); - } + case 1 -> of(labels[0]); + case 2 -> of(labels[0], labels[1]); + case 3 -> of(labels[0], labels[1], labels[2]); + case 4 -> of(labels[0], labels[1], labels[2], labels[3]); + default -> new TensorAddressAnyN(Arrays.copyOf(labels, labels.length)); + }; } - private static TensorAddress ofUnsafe(int label) { + private static TensorAddress of(long label) { return new TensorAddressAny1(label); } - private static TensorAddress ofUnsafe(int label0, int label1) { + private static TensorAddress of(long label0, long label1) { return new TensorAddressAny2(label0, label1); } - private static TensorAddress ofUnsafe(int label0, int label1, int label2) { + public static TensorAddress of(long label0, long label1, long label2) { return new TensorAddressAny3(label0, label1, label2); } - private static TensorAddress ofUnsafe(int label0, int label1, int label2, int label3) { + public static TensorAddress of(long label0, long label1, long label2, long label3) { return new TensorAddressAny4(label0, label1, label2, label3); } - public static TensorAddress ofUnsafe(int ... labels) { + public static TensorAddress ofUnsafe(long ... labels) { return switch (labels.length) { case 0 -> of(); - case 1 -> ofUnsafe(labels[0]); - case 2 -> ofUnsafe(labels[0], labels[1]); - case 3 -> ofUnsafe(labels[0], labels[1], labels[2]); - case 4 -> ofUnsafe(labels[0], labels[1], labels[2], labels[3]); + case 1 -> of(labels[0]); + case 2 -> of(labels[0], labels[1]); + case 3 -> of(labels[0], labels[1], labels[2]); + case 4 -> of(labels[0], labels[1], labels[2], labels[3]); default -> new TensorAddressAnyN(labels); }; } - private static int sanitize(int label) { + private static long sanitize(long label) { if (label < Tensor.invalidIndex) { throw new IndexOutOfBoundsException("cell label " + label + " must be positive"); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny1.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny1.java index a9be6173781..91b2e889ffa 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny1.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny1.java @@ -11,9 +11,9 @@ import com.yahoo.tensor.TensorAddress; */ final class TensorAddressAny1 extends TensorAddressAny { - private final int label; + private final long label; - TensorAddressAny1(int label) { this.label = label; } + TensorAddressAny1(long label) { this.label = label; } @Override public int size() { return 1; } @@ -27,11 +27,11 @@ final class TensorAddressAny1 extends TensorAddressAny { @Override public TensorAddress withLabel(int labelIndex, long label) { - if (labelIndex == 0) return new TensorAddressAny1(Convert.safe2Int(label)); + if (labelIndex == 0) return new TensorAddressAny1(label); throw new IllegalArgumentException("No label " + labelIndex); } - @Override public int hashCode() { return Math.abs(label); } + @Override public int hashCode() { return (int)Math.abs(label); } @Override public boolean equals(Object o) { diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny2.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny2.java index 43f65d495cf..771b2499dc5 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny2.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny2.java @@ -13,9 +13,9 @@ import static java.lang.Math.abs; */ final class TensorAddressAny2 extends TensorAddressAny { - private final int label0, label1; + private final long label0, label1; - TensorAddressAny2(int label0, int label1) { + TensorAddressAny2(long label0, long label1) { this.label0 = label0; this.label1 = label1; } @@ -34,15 +34,16 @@ final class TensorAddressAny2 extends TensorAddressAny { @Override public TensorAddress withLabel(int labelIndex, long label) { return switch (labelIndex) { - case 0 -> new TensorAddressAny2(Convert.safe2Int(label), label1); - case 1 -> new TensorAddressAny2(label0, Convert.safe2Int(label)); + case 0 -> new TensorAddressAny2(label, label1); + case 1 -> new TensorAddressAny2(label0, label); default -> throw new IllegalArgumentException("No label " + labelIndex); }; } @Override public int hashCode() { - return abs(label0) | (abs(label1) << 32 - Integer.numberOfLeadingZeros(abs(label0))); + long hash = abs(label0) | (abs(label1) << (64 - Long.numberOfLeadingZeros(abs(label0)))); + return (int) hash; } @Override diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny3.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny3.java index c22ff47b3c4..998a6a073fe 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny3.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny3.java @@ -13,9 +13,9 @@ import static java.lang.Math.abs; */ final class TensorAddressAny3 extends TensorAddressAny { - private final int label0, label1, label2; + private final long label0, label1, label2; - TensorAddressAny3(int label0, int label1, int label2) { + TensorAddressAny3(long label0, long label1, long label2) { this.label0 = label0; this.label1 = label1; this.label2 = label2; @@ -36,18 +36,19 @@ final class TensorAddressAny3 extends TensorAddressAny { @Override public TensorAddress withLabel(int labelIndex, long label) { return switch (labelIndex) { - case 0 -> new TensorAddressAny3(Convert.safe2Int(label), label1, label2); - case 1 -> new TensorAddressAny3(label0, Convert.safe2Int(label), label2); - case 2 -> new TensorAddressAny3(label0, label1, Convert.safe2Int(label)); + case 0 -> new TensorAddressAny3(label, label1, label2); + case 1 -> new TensorAddressAny3(label0, label, label2); + case 2 -> new TensorAddressAny3(label0, label1, label); default -> throw new IllegalArgumentException("No label " + labelIndex); }; } @Override public int hashCode() { - return abs(label0) | - (abs(label1) << (1*32 - Integer.numberOfLeadingZeros(abs(label0)))) | - (abs(label2) << (2*32 - (Integer.numberOfLeadingZeros(abs(label0)) + Integer.numberOfLeadingZeros(abs(label1))))); + long hash = abs(label0) | + (abs(label1) << (1*64 - Long.numberOfLeadingZeros(abs(label0)))) | + (abs(label2) << (2*64 - (Long.numberOfLeadingZeros(abs(label0)) + Long.numberOfLeadingZeros(abs(label1))))); + return (int) hash; } @Override diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny4.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny4.java index 6eb6b9216bf..197d1e7d580 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny4.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny4.java @@ -13,9 +13,9 @@ import static java.lang.Math.abs; */ final class TensorAddressAny4 extends TensorAddressAny { - private final int label0, label1, label2, label3; + private final long label0, label1, label2, label3; - TensorAddressAny4(int label0, int label1, int label2, int label3) { + TensorAddressAny4(long label0, long label1, long label2, long label3) { this.label0 = label0; this.label1 = label1; this.label2 = label2; @@ -38,20 +38,21 @@ final class TensorAddressAny4 extends TensorAddressAny { @Override public TensorAddress withLabel(int labelIndex, long label) { return switch (labelIndex) { - case 0 -> new TensorAddressAny4(Convert.safe2Int(label), label1, label2, label3); - case 1 -> new TensorAddressAny4(label0, Convert.safe2Int(label), label2, label3); - case 2 -> new TensorAddressAny4(label0, label1, Convert.safe2Int(label), label3); - case 3 -> new TensorAddressAny4(label0, label1, label2, Convert.safe2Int(label)); + case 0 -> new TensorAddressAny4(label, label1, label2, label3); + case 1 -> new TensorAddressAny4(label0, label, label2, label3); + case 2 -> new TensorAddressAny4(label0, label1,label, label3); + case 3 -> new TensorAddressAny4(label0, label1, label2, label); default -> throw new IllegalArgumentException("No label " + labelIndex); }; } @Override public int hashCode() { - return abs(label0) | - (abs(label1) << (1*32 - Integer.numberOfLeadingZeros(abs(label0)))) | - (abs(label2) << (2*32 - (Integer.numberOfLeadingZeros(abs(label0)) + Integer.numberOfLeadingZeros(abs(label1))))) | - (abs(label3) << (3*32 - (Integer.numberOfLeadingZeros(abs(label0)) + Integer.numberOfLeadingZeros(abs(label1)) + Integer.numberOfLeadingZeros(abs(label1))))); + long hash = abs(label0) | + (abs(label1) << (1*64 - Long.numberOfLeadingZeros(abs(label0)))) | + (abs(label2) << (2*64 - (Long.numberOfLeadingZeros(abs(label0)) + Long.numberOfLeadingZeros(abs(label1))))) | + (abs(label3) << (3*64 - (Long.numberOfLeadingZeros(abs(label0)) + Long.numberOfLeadingZeros(abs(label1)) + Long.numberOfLeadingZeros(abs(label1))))); + return (int) hash; } @Override diff --git a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAnyN.java b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAnyN.java index d5bac62bf18..2126ab21709 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAnyN.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAnyN.java @@ -15,9 +15,9 @@ import static java.lang.Math.abs; */ final class TensorAddressAnyN extends TensorAddressAny { - private final int[] labels; + private final long[] labels; - TensorAddressAnyN(int[] labels) { + TensorAddressAnyN(long[] labels) { if (labels.length < 1) throw new IllegalArgumentException("Need at least 1 label"); this.labels = labels; } @@ -28,17 +28,17 @@ final class TensorAddressAnyN extends TensorAddressAny { @Override public TensorAddress withLabel(int labelIndex, long label) { - int[] copy = Arrays.copyOf(labels, labels.length); - copy[labelIndex] = Convert.safe2Int(label); + long[] copy = Arrays.copyOf(labels, labels.length); + copy[labelIndex] = label; return new TensorAddressAnyN(copy); } @Override public int hashCode() { - int hash = abs(labels[0]); + long hash = abs(labels[0]); for (int i = 0; i < size(); i++) { - hash = hash | (abs(labels[i]) << (32 - Integer.numberOfLeadingZeros(hash))); + hash = hash | (abs(labels[i]) << (32 - Long.numberOfLeadingZeros(hash))); } - return hash; + return (int) hash; } @Override |