-
Notifications
You must be signed in to change notification settings - Fork 25.6k
TSDB: Change _tsid field to SortedDocValuesField
#83045
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
3ae4221
14b34fa
e2ff96a
ae1b787
5067b71
89e0df8
e69d637
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| /* | ||
| * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
| * or more contributor license agreements. Licensed under the Elastic License | ||
| * 2.0 and the Server Side Public License, v 1; you may not use this file except | ||
| * in compliance with, at your election, the Elastic License 2.0 or the Server | ||
| * Side Public License, v 1. | ||
| */ | ||
|
|
||
| package org.elasticsearch.index.fielddata.plain; | ||
|
|
||
| import org.apache.lucene.index.LeafReaderContext; | ||
| import org.apache.lucene.index.OrdinalMap; | ||
| import org.apache.lucene.index.SortedSetDocValues; | ||
| import org.apache.lucene.search.SortField; | ||
| import org.apache.lucene.search.SortedSetSortField; | ||
| import org.elasticsearch.common.util.BigArrays; | ||
| import org.elasticsearch.core.Nullable; | ||
| import org.elasticsearch.index.fielddata.IndexFieldData; | ||
| import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource.Nested; | ||
| import org.elasticsearch.index.fielddata.IndexFieldDataCache; | ||
| import org.elasticsearch.index.fielddata.LeafOrdinalsFieldData; | ||
| import org.elasticsearch.indices.breaker.CircuitBreakerService; | ||
| import org.elasticsearch.script.field.ToScriptField; | ||
| import org.elasticsearch.search.DocValueFormat; | ||
| import org.elasticsearch.search.MultiValueMode; | ||
| import org.elasticsearch.search.aggregations.support.ValuesSourceType; | ||
| import org.elasticsearch.search.sort.BucketedSort; | ||
| import org.elasticsearch.search.sort.SortOrder; | ||
|
|
||
| import static org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource.sortMissingLast; | ||
|
|
||
| public class SortedOrdinalsIndexFieldData extends AbstractIndexOrdinalsFieldData { | ||
|
|
||
| public static class Builder implements IndexFieldData.Builder { | ||
| private final String name; | ||
| private final ToScriptField<SortedSetDocValues> toScriptField; | ||
| private final ValuesSourceType valuesSourceType; | ||
|
|
||
| public Builder(String name, ValuesSourceType valuesSourceType, ToScriptField<SortedSetDocValues> toScriptField) { | ||
| this.name = name; | ||
| this.toScriptField = toScriptField; | ||
| this.valuesSourceType = valuesSourceType; | ||
| } | ||
|
|
||
| @Override | ||
| public SortedOrdinalsIndexFieldData build(IndexFieldDataCache cache, CircuitBreakerService breakerService) { | ||
| return new SortedOrdinalsIndexFieldData(cache, name, valuesSourceType, breakerService, toScriptField); | ||
| } | ||
| } | ||
|
|
||
| public SortedOrdinalsIndexFieldData( | ||
| IndexFieldDataCache cache, | ||
| String fieldName, | ||
| ValuesSourceType valuesSourceType, | ||
| CircuitBreakerService breakerService, | ||
| ToScriptField<SortedSetDocValues> toScriptField | ||
| ) { | ||
| super(fieldName, valuesSourceType, cache, breakerService, toScriptField); | ||
| } | ||
|
|
||
| @Override | ||
| public SortField sortField(@Nullable Object missingValue, MultiValueMode sortMode, Nested nested, boolean reverse) { | ||
| SortField sortField = new SortField(getFieldName(), SortField.Type.STRING, reverse); | ||
| sortField.setMissingValue( | ||
| sortMissingLast(missingValue) ^ reverse ? SortedSetSortField.STRING_LAST : SortedSetSortField.STRING_FIRST | ||
| ); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we expect anything to be missing a
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In time series indices |
||
| return sortField; | ||
| } | ||
|
|
||
| @Override | ||
| public BucketedSort newBucketedSort( | ||
| BigArrays bigArrays, | ||
| Object missingValue, | ||
| MultiValueMode sortMode, | ||
| Nested nested, | ||
| SortOrder sortOrder, | ||
| DocValueFormat format, | ||
| int bucketSize, | ||
| BucketedSort.ExtraData extra | ||
| ) { | ||
| throw new IllegalArgumentException("only supported on numeric fields"); | ||
| } | ||
|
|
||
| @Override | ||
| public LeafOrdinalsFieldData load(LeafReaderContext context) { | ||
| // Doc value fields are loaded using Lucene's DocValues#getSortedSet | ||
| // that can happily load SortedDocValues as well. | ||
| return new SortedSetBytesLeafFieldData(context.reader(), getFieldName(), toScriptField); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Might be worth a comment here that |
||
| } | ||
|
|
||
| @Override | ||
| public LeafOrdinalsFieldData loadDirect(LeafReaderContext context) { | ||
| return load(context); | ||
| } | ||
|
|
||
| @Override | ||
| public OrdinalMap getOrdinalMap() { | ||
| return null; | ||
| } | ||
|
|
||
| @Override | ||
| public boolean supportsGlobalOrdinalsMapping() { | ||
| return true; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,9 +8,10 @@ | |
|
|
||
| package org.elasticsearch.search.aggregations.timeseries; | ||
|
|
||
| import org.apache.lucene.index.DocValues; | ||
| import org.apache.lucene.index.LeafReaderContext; | ||
| import org.apache.lucene.index.SortedDocValues; | ||
| import org.apache.lucene.index.SortedNumericDocValues; | ||
| import org.apache.lucene.index.SortedSetDocValues; | ||
| import org.apache.lucene.search.DocIdSetIterator; | ||
| import org.apache.lucene.search.IndexSearcher; | ||
| import org.apache.lucene.search.LeafCollector; | ||
|
|
@@ -80,7 +81,7 @@ private static class LeafWalker { | |
| private final LeafCollector collector; | ||
| private final Bits liveDocs; | ||
| private final DocIdSetIterator iterator; | ||
| private final SortedSetDocValues tsids; | ||
| private final SortedDocValues tsids; | ||
| private final SortedNumericDocValues timestamps; | ||
| final int docBase; | ||
| int docId; | ||
|
|
@@ -93,8 +94,8 @@ private static class LeafWalker { | |
| this.collector.setScorer(scorer); | ||
| iterator = scorer.iterator(); | ||
| docBase = context.docBase; | ||
| tsids = context.reader().getSortedSetDocValues(TimeSeriesIdFieldMapper.NAME); | ||
| timestamps = context.reader().getSortedNumericDocValues(DataStream.TimestampField.FIXED_TIMESTAMP_FIELD); | ||
| tsids = DocValues.getSorted(context.reader(), TimeSeriesIdFieldMapper.NAME); | ||
| timestamps = DocValues.getSortedNumeric(context.reader(), DataStream.TimestampField.FIXED_TIMESTAMP_FIELD); | ||
| } | ||
|
|
||
| void collectCurrent() throws IOException { | ||
|
|
@@ -106,7 +107,7 @@ boolean next() throws IOException { | |
| docId = iterator.nextDoc(); | ||
| if (docId != DocIdSetIterator.NO_MORE_DOCS && (liveDocs == null || liveDocs.get(docId))) { | ||
| if (tsids.advanceExact(docId)) { | ||
| BytesRef tsid = tsids.lookupOrd(tsids.nextOrd()); | ||
| BytesRef tsid = tsids.lookupOrd(tsids.ordValue()); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can replace this with an ord comparison now that we know there's a single value, but let's do that in a follow-up. |
||
| if (timestamps.advanceExact(docId)) { | ||
| this.timestamp = timestamps.nextValue(); | ||
| if (tsid.equals(this.tsid) == false) { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if setting this to
SortField.Type.STRINGby default is ok.If I leave it to the default
SortField.Type.CUSTOMmethodIndexSortConfig#validateIndexSortFieldfailsThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Type.STRINGis correct here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Type.CUSTOMmeans that it's expecting you to give it a custom FieldComparator, which we don't need. It is a horrible API from about 2004 and I keep meaning to hack it out and replace it with something less awful...