package org.apache.blur.analysis;
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.blur.analysis.type.TextFieldTypeDefinition;
import org.apache.blur.thrift.generated.Column;
import org.apache.blur.thrift.generated.Record;
import org.apache.blur.utils.BlurConstants;
import org.apache.hadoop.conf.Configuration;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.junit.Test;
public class BaseFieldManagerTest {
public static final String _fieldLessField = BlurConstants.SUPER;
@Test
public void testFieldManager() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, true, "text", false, false, null);
Record record = new Record();
record.setFamily("fam1");
record.setRecordId("1213");
record.addToColumns(new Column("col1", "value1"));
List<Field> fields = getFields("fam1", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"),
newTextField("fam1.col1", "value1"), newTextFieldNoStore(_fieldLessField, "value1"));
int c = 0;
for (Field field : memoryFieldManager.getFields("1", record)) {
assertFieldEquals(fields.get(c++), field);
}
}
private Field newFieldsNoStore(String name, String value) {
return new StringField(name, value, Store.NO);
}
@Test
public void testFieldManagerWithNullFamily() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition(null, "col1", null, true, "text", false, false, null);
Record record = new Record();
record.setRecordId("1213");
record.addToColumns(new Column("col1", "value1"));
List<Field> fields = getFields(null, "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "_default_.col1"),
newTextField(memoryFieldManager.resolveField("col1"), "value1"), newTextFieldNoStore(_fieldLessField, "value1"));
int c = 0;
for (Field field : memoryFieldManager.getFields("1", record)) {
assertFieldEquals(fields.get(c++), field);
}
}
@Test
public void testFieldManagerMultipleColumnsSameName() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, true, null);
Record record = new Record();
record.setFamily("fam1");
record.setRecordId("1213");
record.addToColumns(new Column("col1", "value1"));
record.addToColumns(new Column("col1", "value2"));
List<Field> fields = getFields("fam1", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"),
newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"), newTextField("fam1.col1", "value1"),
newTextField("fam1.col1", "value2"));
int c = 0;
for (Field field : memoryFieldManager.getFields("1", record)) {
// assertFieldEquals(fields.get(c++), field);
System.out.println("Should be [" + fields.get(c++) + "] was [" + field + "]");
}
}
@Test
public void testFieldManagerMultipleColumnsSameNameWhenNotAllowed() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, false, null);
Record record = new Record();
record.setFamily("fam1");
record.setRecordId("1213");
record.addToColumns(new Column("col1", "value1"));
record.addToColumns(new Column("col1", "value2"));
try {
memoryFieldManager.getFields("1", record);
fail();
} catch (IOException ex) {
assertEquals("Field [fam1.col1] does not allow more than one column value.", ex.getMessage());
}
}
@Test
public void testFieldManagerMultipleColumnsDifferentNames() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, false, null);
memoryFieldManager.addColumnDefinition("fam1", "col2", null, true, "text", false, false, null);
Record record = new Record();
record.setFamily("fam1");
record.setRecordId("1213");
record.addToColumns(new Column("col1", "value1"));
record.addToColumns(new Column("col2", "value2"));
List<Field> fields = getFields("fam1", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"),
newFieldsNoStore(BlurConstants.FIELDS, "fam1.col2"), newTextField("fam1.col1", "value1"),
newTextField("fam1.col2", "value2"), newTextFieldNoStore(BlurConstants.SUPER, "value2"));
int c = 0;
List<Field> fields2 = memoryFieldManager.getFields("1", record);
for (Field field : fields2) {
assertFieldEquals(fields.get(c++), field);
}
}
@Test
public void testFieldManagerMultipleColumnsDifferentNamesDifferentFamilies() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, false, null);
memoryFieldManager.addColumnDefinition("fam2", "col2", null, false, "text", false, false, null);
Record record1 = new Record();
record1.setFamily("fam1");
record1.setRecordId("1213");
record1.addToColumns(new Column("col1", "value1"));
List<Field> fields1 = getFields("fam1", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"),
newTextField("fam1.col1", "value1"));
int c1 = 0;
for (Field field : memoryFieldManager.getFields("1", record1)) {
assertFieldEquals(fields1.get(c1++), field);
}
Record record2 = new Record();
record2.setFamily("fam2");
record2.setRecordId("1213");
record2.addToColumns(new Column("col2", "value1"));
List<Field> fields2 = getFields("fam2", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam2.col2"),
newTextField("fam2.col2", "value1"));
int c2 = 0;
for (Field field : memoryFieldManager.getFields("1", record2)) {
assertFieldEquals(fields2.get(c2++), field);
}
}
@Test
public void testFieldManagerMultipleColumnsDifferentNamesNullFamilies() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition(null, "col1", null, false, "text", false, false, null);
memoryFieldManager.addColumnDefinition(null, "col2", null, false, "text", false, false, null);
Record record1 = new Record();
record1.setRecordId("1213");
record1.addToColumns(new Column("col1", "value1"));
List<Field> fields1 = getFields(null, "1", "1213",
newFieldsNoStore(BlurConstants.FIELDS, BlurConstants.DEFAULT_FAMILY + ".col1"),
newTextField(memoryFieldManager.resolveField("col1"), "value1"));
int c1 = 0;
for (Field field : memoryFieldManager.getFields("1", record1)) {
assertFieldEquals(fields1.get(c1++), field);
}
Record record2 = new Record();
record2.setRecordId("1213");
record2.addToColumns(new Column("col2", "value1"));
List<Field> fields2 = getFields(null, "1", "1213",
newFieldsNoStore(BlurConstants.FIELDS, BlurConstants.DEFAULT_FAMILY + ".col2"),
newTextField(memoryFieldManager.resolveField("col2"), "value1"));
int c2 = 0;
for (Field field : memoryFieldManager.getFields("1", record2)) {
assertFieldEquals(fields2.get(c2++), field);
}
}
@Test
public void testFieldManagerSubNameWithMainColumnNameNoParent() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
try {
memoryFieldManager.addColumnDefinition("fam1", "col1", "sub1", false, "text", false, false, null);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
}
}
@Test
public void testFieldManagerSubNameWithMainColumnNameNoFieldLess() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, false, null);
try {
memoryFieldManager.addColumnDefinition("fam1", "col1", "sub1", true, "text", false, false, null);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
}
}
@Test
public void testFieldManagerSubName() throws IOException {
FieldManager memoryFieldManager = newFieldManager(true);
memoryFieldManager.addColumnDefinition("fam1", "col1", null, false, "text", false, false, null);
memoryFieldManager.addColumnDefinition("fam1", "col1", "sub1", false, "text", false, false, null);
Record record = new Record();
record.setRecordId("1213");
record.setFamily("fam1");
record.addToColumns(new Column("col1", "value1"));
List<Field> fields = getFields("fam1", "1", "1213", newFieldsNoStore(BlurConstants.FIELDS, "fam1.col1"),
newTextField("fam1.col1", "value1"), newTextFieldNoStore("fam1.col1.sub1", "value1"));
int c = 0;
for (Field field : memoryFieldManager.getFields("1", record)) {
assertFieldEquals(fields.get(c++), field);
}
}
private List<Field> getFields(String family, String rowId, String recordId, Field... fields) {
List<Field> fieldLst = new ArrayList<Field>();
if (family != null) {
fieldLst.add(new Field(BlurConstants.FAMILY, family, BaseFieldManager.ID_TYPE));
} else {
fieldLst.add(new Field(BlurConstants.FAMILY, BlurConstants.DEFAULT_FAMILY, BaseFieldManager.ID_TYPE));
}
fieldLst.add(new Field(BlurConstants.ROW_ID, rowId, BaseFieldManager.ID_TYPE));
fieldLst.add(new Field(BlurConstants.RECORD_ID, recordId, BaseFieldManager.ID_TYPE));
for (Field field : fields) {
fieldLst.add(field);
}
return fieldLst;
}
private Field newTextField(String name, String value) {
return new Field(name, value, TextFieldTypeDefinition.TYPE_STORED);
}
private Field newTextFieldNoStore(String name, String value) {
return new Field(name, value, TextFieldTypeDefinition.TYPE_NOT_STORED);
}
private void assertFieldEquals(Field expected, Field actual) {
assertEquals("Names did not match Expected [" + expected + "] Actual [" + actual + "]", expected.name(),
actual.name());
assertEquals("Values did not match Expected [" + expected + "] Actual [" + actual + "]", expected.stringValue(),
actual.stringValue());
assertEquals("FileTypes did not match Expected [" + expected + "] Actual [" + actual + "]", expected.fieldType()
.toString(), actual.fieldType().toString());
}
protected FieldManager newFieldManager(boolean create) throws IOException {
return new BaseFieldManager(_fieldLessField, new KeywordAnalyzer(), new Configuration()) {
@Override
protected boolean tryToStore(FieldTypeDefinition fieldTypeDefinition, String fieldName) {
return true;
}
@Override
protected void tryToLoad(String field) {
}
@Override
protected List<String> getFieldNamesToLoad() throws IOException {
return new ArrayList<String>();
}
};
}
}