// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.searchdefinition.fieldoperation;
import com.yahoo.searchdefinition.Index;
import com.yahoo.searchdefinition.Index.Type;
import com.yahoo.searchdefinition.document.BooleanIndexDefinition;
import com.yahoo.searchdefinition.document.SDField;
import com.yahoo.searchdefinition.document.Stemming;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
/**
* @author Einar M R Rosenvinge
*/
public class IndexOperation implements FieldOperation {
private String indexName;
private Optional prefix = Optional.empty();
private List aliases = new LinkedList<>();
private Optional stemming = Optional.empty();
private Optional type = Optional.empty();
private OptionalInt arity = OptionalInt.empty(); // For predicate data type in boolean search
private OptionalLong lowerBound = OptionalLong.empty();
private OptionalLong upperBound = OptionalLong.empty();
private OptionalDouble densePostingListThreshold = OptionalDouble.empty();
public String getIndexName() {
return indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
public boolean getPrefix() {
return prefix.get();
}
public void setPrefix(Boolean prefix) {
this.prefix = Optional.of(prefix);
}
public void addAlias(String alias) {
aliases.add(alias);
}
public String getStemming() {
return stemming.get();
}
public void setStemming(String stemming) {
this.stemming = Optional.of(stemming);
}
public void apply(SDField field) {
Index index = field.getIndex(indexName);
if (index == null) {
index = new Index(indexName);
field.addIndex(index);
}
applyToIndex(index);
}
public void applyToIndex(Index index) {
if (prefix.isPresent()) {
index.setPrefix(prefix.get());
}
for (String alias : aliases) {
index.addAlias(alias);
}
if (stemming.isPresent()) {
index.setStemming(Stemming.get(stemming.get()));
}
if (type.isPresent()) {
index.setType(type.get());
}
if (arity.isPresent() || lowerBound.isPresent() ||
upperBound.isPresent() || densePostingListThreshold.isPresent()) {
index.setBooleanIndexDefiniton(
new BooleanIndexDefinition(arity, lowerBound, upperBound, densePostingListThreshold));
}
}
public Type getType() {
return type.get();
}
public void setType(Type type) {
this.type = Optional.of(type);
}
public void setArity(int arity) {
this.arity = OptionalInt.of(arity);
}
public void setLowerBound(long value) {
this.lowerBound = OptionalLong.of(value);
}
public void setUpperBound(long value) {
this.upperBound = OptionalLong.of(value);
}
public void setDensePostingListThreshold(double densePostingListThreshold) {
this.densePostingListThreshold = OptionalDouble.of(densePostingListThreshold);
}
}