diff --git a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java index 65fa96d12c3..cc322afd0b8 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java +++ b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java @@ -58,7 +58,6 @@ public class IndexFieldDataService extends AbstractIndexComponent { .immutableMap(); buildersByTypeAndFormat = MapBuilder., IndexFieldData.Builder>newMapBuilder() - .put(Tuple.tuple("string", "concrete_bytes"), new ConcreteBytesRefIndexFieldData.Builder()) .put(Tuple.tuple("string", "paged_bytes"), new PagedBytesIndexFieldData.Builder()) .put(Tuple.tuple("string", "fst"), new FSTBytesIndexFieldData.Builder()) .put(Tuple.tuple("float", "array"), new FloatArrayIndexFieldData.Builder()) diff --git a/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefAtomicFieldData.java b/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefAtomicFieldData.java deleted file mode 100644 index cfd69b668f7..00000000000 --- a/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefAtomicFieldData.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this - * file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.index.fielddata.plain; - -import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.RamUsage; -import org.elasticsearch.index.fielddata.AtomicFieldData; -import org.elasticsearch.index.fielddata.ScriptDocValues; -import org.elasticsearch.index.fielddata.ordinals.EmptyOrdinals; -import org.elasticsearch.index.fielddata.ordinals.Ordinals; -import org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs; - -/** - */ -public class ConcreteBytesRefAtomicFieldData implements AtomicFieldData.WithOrdinals { - - public static ConcreteBytesRefAtomicFieldData empty(int numDocs) { - return new Empty(numDocs); - } - - // 0 ordinal in values means no value (its null) - private final BytesRef[] values; - protected final Ordinals ordinals; - - private volatile int[] hashes; - private long size = -1; - - public ConcreteBytesRefAtomicFieldData(BytesRef[] values, Ordinals ordinals) { - this.values = values; - this.ordinals = ordinals; - } - - @Override - public void close() { - } - - @Override - public boolean isMultiValued() { - return ordinals.isMultiValued(); - } - - @Override - public int getNumDocs() { - return ordinals.getNumDocs(); - } - - @Override - public boolean isValuesOrdered() { - return true; - } - - @Override - public long getMemorySizeInBytes() { - if (size == -1) { - long size = RamUsage.NUM_BYTES_ARRAY_HEADER; - for (BytesRef value : values) { - if (value != null) { - size += RamUsage.NUM_BYTES_OBJECT_REF + RamUsage.NUM_BYTES_OBJECT_HEADER + - RamUsage.NUM_BYTES_ARRAY_HEADER + (value.length + (2 * RamUsage.NUM_BYTES_INT)); - } - } - size += ordinals.getMemorySizeInBytes(); - this.size = size; - } - return size; - } - - @Override - public BytesValues.WithOrdinals getBytesValues() { - return ordinals.isMultiValued() ? new BytesValues.Multi(values, ordinals.ordinals()) : new BytesValues.Single(values, ordinals.ordinals()); - } - - @Override - public BytesValues getHashedBytesValues() { - if (hashes == null) { - int[] hashes = new int[values.length]; - for (int i = 0; i < values.length; i++) { - BytesRef value = values[i]; - hashes[i] = value == null ? 0 : value.hashCode(); - } - this.hashes = hashes; - } - return ordinals.isMultiValued() ? new BytesValues.MultiHashed(values, ordinals.ordinals(), hashes) : new BytesValues.SingleHashed(values, ordinals.ordinals(), hashes); - } - - - @Override - public ScriptDocValues.Strings getScriptValues() { - return new ScriptDocValues.Strings(getBytesValues()); - } - - static abstract class BytesValues extends org.elasticsearch.index.fielddata.BytesValues.WithOrdinals { - - protected final BytesRef[] values; - - BytesValues(BytesRef[] values, Ordinals.Docs ordinals) { - super(ordinals); - this.values = values; - } - - @Override - public BytesRef getValueByOrd(int ord) { - return values[ord]; - } - - @Override - public BytesRef getValueScratchByOrd(int ord, BytesRef ret) { - BytesRef value = values[ord]; - if (value == null) { - ret.length = 0; - } else { - ret.bytes = value.bytes; - ret.offset = value.offset; - ret.length = value.length; - } - return ret; - } - - @Override - public BytesRef getSafeValueByOrd(int ord) { - return values[ord]; - } - - @Override - public BytesRef makeSafe(BytesRef bytes) { - // no need to do anything, its already concrete bytes... - return bytes; - } - - static class Single extends BytesValues { - - private final Iter.Single iter; - - Single(BytesRef[] values, Ordinals.Docs ordinals) { - super(values, ordinals); - this.iter = newSingleIter(); - } - - @Override - public Iter getIter(int docId) { - int ord = ordinals.getOrd(docId); - if (ord == 0) return Iter.Empty.INSTANCE; - return iter.reset(values[ord], ord); - } - } - - static final class SingleHashed extends Single { - private final int[] hashes; - SingleHashed(BytesRef[] values, Docs ordinals, int[] hashes) { - super(values, ordinals); - this.hashes = hashes; - } - - @Override - protected Iter.Single newSingleIter() { - return new Iter.Single() { - public int hash() { - return hashes[ord]; - } - }; - } - - @Override - public int getValueHashed(int docId, BytesRef ret) { - final int ord = ordinals.getOrd(docId); - getValueScratchByOrd(ord, ret); - return hashes[ord]; - } - } - - static class Multi extends BytesValues { - - private final Iter.Multi iter; - - Multi(BytesRef[] values, Ordinals.Docs ordinals) { - super(values, ordinals); - assert ordinals.isMultiValued(); - this.iter = newMultiIter(); - } - - @Override - protected Iter.Multi newMultiIter() { - return new Iter.Multi(this) { - private BytesRef current = null; - @Override - public BytesRef next() { - current = withOrds.getValueByOrd(innerOrd); - ord = innerOrd; - innerOrd = ordsIter.next(); - return current; - } - public int hash() { - assert current != null; - return current.hashCode(); - } - }; - } - - @Override - public Iter getIter(int docId) { - return iter.reset(ordinals.getIter(docId)); - } - - } - - static final class MultiHashed extends Multi { - private final int[] hashes; - - MultiHashed(BytesRef[] values, Ordinals.Docs ordinals, int[] hashes) { - super(values, ordinals); - this.hashes = hashes; - } - - @Override - protected Iter.Multi newMultiIter() { - return new Iter.Multi(this) { - private BytesRef current = null; - @Override - public BytesRef next() { - current = withOrds.getValueByOrd(innerOrd); - ord = innerOrd; - innerOrd = ordsIter.next(); - return current; - } - - public int hash() { - return hashes[ord]; - } - }; - } - - @Override - public int getValueHashed(int docId, BytesRef ret) { - final int ord = ordinals.getOrd(docId); - getValueScratchByOrd(ord, ret); - return hashes[ord]; - } - - } - } - - - static class Empty extends ConcreteBytesRefAtomicFieldData { - - Empty(int numDocs) { - super(null, new EmptyOrdinals(numDocs)); - } - - @Override - public boolean isMultiValued() { - return false; - } - - @Override - public int getNumDocs() { - return ordinals.getNumDocs(); - } - - @Override - public boolean isValuesOrdered() { - return true; - } - - @Override - public long getMemorySizeInBytes() { - return 0; - } - - @Override - public BytesValues.WithOrdinals getBytesValues() { - return new BytesValues.WithOrdinals.Empty(ordinals.ordinals()); - } - - @Override - public ScriptDocValues.Strings getScriptValues() { - return ScriptDocValues.EMPTY_STRINGS; - } - } -} diff --git a/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefIndexFieldData.java b/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefIndexFieldData.java deleted file mode 100644 index d17edf7d812..00000000000 --- a/src/main/java/org/elasticsearch/index/fielddata/plain/ConcreteBytesRefIndexFieldData.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this - * file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.index.fielddata.plain; - -import java.util.ArrayList; - -import org.apache.lucene.index.AtomicReader; -import org.apache.lucene.index.AtomicReaderContext; -import org.apache.lucene.index.Terms; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.BytesRefIterator; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.Index; -import org.elasticsearch.index.fielddata.FieldDataType; -import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.fielddata.IndexFieldDataCache; -import org.elasticsearch.index.fielddata.ordinals.OrdinalsBuilder; -import org.elasticsearch.index.mapper.FieldMapper; -import org.elasticsearch.index.settings.IndexSettings; - -/** - */ -public class ConcreteBytesRefIndexFieldData extends AbstractBytesIndexFieldData { - - public static class Builder implements IndexFieldData.Builder { - - @Override - public IndexFieldData build(Index index, @IndexSettings Settings indexSettings, FieldMapper.Names fieldNames, FieldDataType type, IndexFieldDataCache cache) { - return new ConcreteBytesRefIndexFieldData(index, indexSettings, fieldNames, type, cache); - } - } - - public ConcreteBytesRefIndexFieldData(Index index, @IndexSettings Settings indexSettings, FieldMapper.Names fieldNames, FieldDataType fieldDataType, IndexFieldDataCache cache) { - super(index, indexSettings, fieldNames, fieldDataType, cache); - } - - @Override - public ConcreteBytesRefAtomicFieldData loadDirect(AtomicReaderContext context) throws Exception { - AtomicReader reader = context.reader(); - - Terms terms = reader.terms(getFieldNames().indexName()); - if (terms == null) { - return ConcreteBytesRefAtomicFieldData.empty(reader.maxDoc()); - } - - long size = terms.size(); - if (size == -1) { - size = 1024; - } - final ArrayList values = new ArrayList((int) size); - values.add(null); // first "t" indicates null value - OrdinalsBuilder builder = new OrdinalsBuilder(terms, reader.maxDoc()); - try { - BytesRefIterator iter = builder.buildFromTerms(filter(terms, reader), reader.getLiveDocs()); - BytesRef term; - while ((term = iter.next()) != null) { - values.add(BytesRef.deepCopyOf(term)); - } - return new ConcreteBytesRefAtomicFieldData(values.toArray(new BytesRef[values.size()]), builder.build(fieldDataType.getSettings())); - } finally { - builder.close(); - } - } -} diff --git a/src/test/java/org/elasticsearch/test/integration/search/facet/ExtendedFacetsTests.java b/src/test/java/org/elasticsearch/test/integration/search/facet/ExtendedFacetsTests.java index f35510e6967..1059571bad0 100644 --- a/src/test/java/org/elasticsearch/test/integration/search/facet/ExtendedFacetsTests.java +++ b/src/test/java/org/elasticsearch/test/integration/search/facet/ExtendedFacetsTests.java @@ -69,13 +69,6 @@ public class ExtendedFacetsTests extends AbstractNodesTests { .addMapping("type1", jsonBuilder().startObject() .startObject("type1") .startObject("properties") - .startObject("field1_concrete") - .field("type", "string") - .field("index", "not_analyzed") - .startObject("fielddata") - .field("format", "concrete_bytes") - .endObject() - .endObject() .startObject("field1_paged") .field("type", "string") .field("index", "not_analyzed") @@ -143,7 +136,6 @@ public class ExtendedFacetsTests extends AbstractNodesTests { String queryVal = queryValues[random.nextInt(numOfQueryValues)]; client.prepareIndex("test", "type1", Integer.toString(i)) .setSource(jsonBuilder().startObject() - .field("field1_concrete", field1Values) .field("field1_paged", field1Values) .field("field1_fst", field1Values) .field("field2", field2Val) @@ -160,7 +152,7 @@ public class ExtendedFacetsTests extends AbstractNodesTests { } client.admin().indices().prepareRefresh().execute().actionGet(); - String[] facetFields = new String[]{"field1_concrete", "field1_paged", "field1_fst"}; + String[] facetFields = new String[]{"field1_paged", "field1_fst"}; TermsFacet.ComparatorType[] compTypes = TermsFacet.ComparatorType.values(); for (String facetField : facetFields) { for (String queryVal : queryValToField1FacetEntries.keySet()) { diff --git a/src/test/java/org/elasticsearch/test/unit/index/fielddata/ConcreteBytesStringFieldDataTests.java b/src/test/java/org/elasticsearch/test/unit/index/fielddata/ConcreteBytesStringFieldDataTests.java deleted file mode 100644 index 6b2cb5c78c1..00000000000 --- a/src/test/java/org/elasticsearch/test/unit/index/fielddata/ConcreteBytesStringFieldDataTests.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this - * file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.test.unit.index.fielddata; - -import org.elasticsearch.common.settings.ImmutableSettings; -import org.elasticsearch.index.fielddata.FieldDataType; -import org.testng.annotations.Test; - -/** - */ -@Test -public class ConcreteBytesStringFieldDataTests extends StringFieldDataTests { - - @Override - protected FieldDataType getFieldDataType() { - return new FieldDataType("string", ImmutableSettings.builder().put("format", "concrete_bytes")); - } -}