summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-02-12 16:22:55 +0100
committerGitHub <noreply@github.com>2024-02-12 16:22:55 +0100
commitc30218b738febd3e4f00392a0e0eaf1b6354e90d (patch)
treebe801409f65cc7811bb1c334c73f0803a63f0354
parentab2e746543da87d457efd5029ae1b6cdca311fc1 (diff)
parent9bf43297fe60aaffc0e2334b39ffb2f57294adb6 (diff)
Merge branch 'master' into balder/use-wanted-hitcount
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java1
-rw-r--r--document/src/main/java/com/yahoo/document/update/TensorModifyUpdate.java2
-rw-r--r--metrics/src/main/java/ai/vespa/metrics/HostedNodeAdminMetrics.java1
-rw-r--r--metrics/src/main/java/ai/vespa/metrics/set/Vespa9DefaultMetricSet.java3
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/UnpackBitsNode.java2
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/hitsaggregationresult.h10
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/vdshit.h16
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h4
-rw-r--r--searchlib/src/vespa/searchlib/index/indexbuilder.h14
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp15
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.h54
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp6
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp4
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.h10
-rw-r--r--vespajlib/abi-spec.json2
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java29
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/functions/Concat.java16
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java7
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/functions/Slice.java4
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/Label.java17
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny.java77
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny1.java8
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny2.java11
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny3.java17
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAny4.java21
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/impl/TensorAddressAnyN.java14
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