public void update() throws MaltChainedException {
singleFeatureValue.reset();
firstFeature.update();
secondFeature.update();
thirdFeature.update();
FeatureValue firstValue = firstFeature.getFeatureValue();
FeatureValue secondValue = secondFeature.getFeatureValue();
FeatureValue thirdValue = thirdFeature.getFeatureValue();
if (firstValue instanceof SingleFeatureValue && secondValue instanceof SingleFeatureValue && thirdValue instanceof SingleFeatureValue) {
String firstSymbol = ((SingleFeatureValue)firstValue).getSymbol();
if (firstValue.isNullValue() && secondValue.isNullValue() && thirdValue.isNullValue()) {
singleFeatureValue.setIndexCode(firstFeature.getSymbolTable().getSymbolStringToCode(firstSymbol));
singleFeatureValue.setSymbol(firstSymbol);
singleFeatureValue.setNullValue(true);
} else {
if (column.getType() == ColumnDescription.STRING) {
StringBuilder mergedValue = new StringBuilder();
mergedValue.append(((SingleFeatureValue)firstValue).getSymbol());
mergedValue.append('~');
mergedValue.append(((SingleFeatureValue)secondValue).getSymbol());
mergedValue.append('~');
mergedValue.append(((SingleFeatureValue)thirdValue).getSymbol());
singleFeatureValue.setIndexCode(table.addSymbol(mergedValue.toString()));
singleFeatureValue.setSymbol(mergedValue.toString());
singleFeatureValue.setNullValue(false);
singleFeatureValue.setValue(1);
} else {
if (firstValue.isNullValue() || secondValue.isNullValue() || thirdValue.isNullValue()) {
singleFeatureValue.setValue(0);
table.addSymbol("#null#");
singleFeatureValue.setSymbol("#null#");
singleFeatureValue.setNullValue(true);
singleFeatureValue.setIndexCode(1);