/*
* Licensed to Elasticsearch 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.shard;
import org.apache.lucene.analysis.CannedTokenStream;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CodecReader;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.TestUtil;
import org.elasticsearch.common.Numbers;
import org.elasticsearch.index.mapper.internal.UidFieldMapper;
import org.elasticsearch.index.mapper.internal.VersionFieldMapper;
import org.elasticsearch.test.ESTestCase;
/** Tests upgrading old document versions from _uid payloads to _version docvalues */
public class VersionFieldUpgraderTests extends ESTestCase {
/** Simple test: one doc in the old format, check that it looks correct */
public void testUpgradeOneDocument() throws Exception {
Directory dir = newDirectory();
IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig(null));
// add a document with a _uid having a payload of 3
Document doc = new Document();
Token token = new Token("1", 0, 1);
token.setPayload(new BytesRef(Numbers.longToBytes(3)));
doc.add(new TextField(UidFieldMapper.NAME, new CannedTokenStream(token)));
iw.addDocument(doc);
iw.commit();
CodecReader reader = getOnlySegmentReader(DirectoryReader.open(iw, true));
CodecReader upgraded = VersionFieldUpgrader.wrap(reader);
// we need to be upgraded, should be a different instance
assertNotSame(reader, upgraded);
// make sure we can see our numericdocvalues in fieldinfos
FieldInfo versionField = upgraded.getFieldInfos().fieldInfo(VersionFieldMapper.NAME);
assertNotNull(versionField);
assertEquals(DocValuesType.NUMERIC, versionField.getDocValuesType());
// should have a value of 3, and be visible in docsWithField
assertEquals(3, upgraded.getNumericDocValues(VersionFieldMapper.NAME).get(0));
assertTrue(upgraded.getDocsWithField(VersionFieldMapper.NAME).get(0));
// verify filterreader with checkindex
TestUtil.checkReader(upgraded);
reader.close();
iw.close();
dir.close();
}
/** test that we are a non-op if the segment already has the version field */
public void testAlreadyUpgraded() throws Exception {
Directory dir = newDirectory();
IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig(null));
// add a document with a _uid having a payload of 3
Document doc = new Document();
Token token = new Token("1", 0, 1);
token.setPayload(new BytesRef(Numbers.longToBytes(3)));
doc.add(new TextField(UidFieldMapper.NAME, new CannedTokenStream(token)));
doc.add(new NumericDocValuesField(VersionFieldMapper.NAME, 3));
iw.addDocument(doc);
iw.commit();
CodecReader reader = getOnlySegmentReader(DirectoryReader.open(iw, true));
CodecReader upgraded = VersionFieldUpgrader.wrap(reader);
// we already upgraded: should be same instance
assertSame(reader, upgraded);
reader.close();
iw.close();
dir.close();
}
/** Test upgrading two documents */
public void testUpgradeTwoDocuments() throws Exception {
Directory dir = newDirectory();
IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig(null));
// add a document with a _uid having a payload of 3
Document doc = new Document();
Token token = new Token("1", 0, 1);
token.setPayload(new BytesRef(Numbers.longToBytes(3)));
doc.add(new TextField(UidFieldMapper.NAME, new CannedTokenStream(token)));
iw.addDocument(doc);
doc = new Document();
token = new Token("2", 0, 1);
token.setPayload(new BytesRef(Numbers.longToBytes(4)));
doc.add(new TextField(UidFieldMapper.NAME, new CannedTokenStream(token)));
iw.addDocument(doc);
iw.commit();
CodecReader reader = getOnlySegmentReader(DirectoryReader.open(iw, true));
CodecReader upgraded = VersionFieldUpgrader.wrap(reader);
// we need to be upgraded, should be a different instance
assertNotSame(reader, upgraded);
// make sure we can see our numericdocvalues in fieldinfos
FieldInfo versionField = upgraded.getFieldInfos().fieldInfo(VersionFieldMapper.NAME);
assertNotNull(versionField);
assertEquals(DocValuesType.NUMERIC, versionField.getDocValuesType());
// should have a values of 3 and 4, and be visible in docsWithField
assertEquals(3, upgraded.getNumericDocValues(VersionFieldMapper.NAME).get(0));
assertEquals(4, upgraded.getNumericDocValues(VersionFieldMapper.NAME).get(1));
assertTrue(upgraded.getDocsWithField(VersionFieldMapper.NAME).get(0));
assertTrue(upgraded.getDocsWithField(VersionFieldMapper.NAME).get(1));
// verify filterreader with checkindex
TestUtil.checkReader(upgraded);
reader.close();
iw.close();
dir.close();
}
}