001 package org.maltparser.core.feature.map;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.feature.FeatureException;
005 import org.maltparser.core.feature.function.FeatureFunction;
006 import org.maltparser.core.feature.function.FeatureMapFunction;
007 import org.maltparser.core.feature.value.FeatureValue;
008 import org.maltparser.core.feature.value.FunctionValue;
009 import org.maltparser.core.feature.value.SingleFeatureValue;
010 import org.maltparser.core.symbol.SymbolTable;
011 import org.maltparser.core.symbol.SymbolTableHandler;
012 /**
013 *
014 *
015 * @author Johan Hall
016 */
017 public class Merge3Feature implements FeatureMapFunction {
018 protected FeatureFunction firstFeature;
019 protected FeatureFunction secondFeature;
020 protected FeatureFunction thirdFeature;
021 protected SymbolTableHandler tableHandler;
022 protected SymbolTable table;
023 protected SingleFeatureValue singleFeatureValue;
024
025 public Merge3Feature(SymbolTableHandler tableHandler) throws MaltChainedException {
026 super();
027 setTableHandler(tableHandler);
028 singleFeatureValue = new SingleFeatureValue(this);
029 }
030
031 public void initialize(Object[] arguments) throws MaltChainedException {
032 if (arguments.length != 3) {
033 throw new FeatureException("Could not initialize Merge3Feature: number of arguments are not correct. ");
034 }
035 if (!(arguments[0] instanceof FeatureFunction)) {
036 throw new FeatureException("Could not initialize Merge3Feature: the first argument is not a feature. ");
037 }
038 if (!(arguments[1] instanceof FeatureFunction)) {
039 throw new FeatureException("Could not initialize Merge3Feature: the second argument is not a feature. ");
040 }
041 if (!(arguments[2] instanceof FeatureFunction)) {
042 throw new FeatureException("Could not initialize Merge3Feature: the third argument is not a feature. ");
043 }
044 setFirstFeature((FeatureFunction)arguments[0]);
045 setSecondFeature((FeatureFunction)arguments[1]);
046 setThirdFeature((FeatureFunction)arguments[2]);
047 setSymbolTable(tableHandler.addSymbolTable("MERGE3_"+firstFeature.getSymbolTable().getName()+"_"+secondFeature.getSymbolTable().getName()+"_"+thirdFeature.getSymbolTable().getName(),
048 firstFeature.getSymbolTable()));
049 }
050
051 public void update() throws MaltChainedException {
052 singleFeatureValue.reset();
053 firstFeature.update();
054 secondFeature.update();
055 thirdFeature.update();
056 FunctionValue firstValue = firstFeature.getFeatureValue();
057 FunctionValue secondValue = secondFeature.getFeatureValue();
058 FunctionValue thirdValue = thirdFeature.getFeatureValue();
059 if (firstValue instanceof SingleFeatureValue && secondValue instanceof SingleFeatureValue && thirdValue instanceof SingleFeatureValue) {
060 String symbol = ((SingleFeatureValue)firstValue).getSymbol();
061 if (((FeatureValue)firstValue).isNullValue() && ((FeatureValue)secondValue).isNullValue() && ((FeatureValue)thirdValue).isNullValue()) {
062 singleFeatureValue.setCode(firstFeature.getSymbolTable().getSymbolStringToCode(symbol));
063 singleFeatureValue.setKnown(firstFeature.getSymbolTable().getKnown(symbol));
064 singleFeatureValue.setSymbol(symbol);
065 singleFeatureValue.setNullValue(true);
066 } else {
067 StringBuilder mergedValue = new StringBuilder();
068 mergedValue.append(((SingleFeatureValue)firstValue).getSymbol());
069 mergedValue.append('~');
070 mergedValue.append(((SingleFeatureValue)secondValue).getSymbol());
071 mergedValue.append('~');
072 mergedValue.append(((SingleFeatureValue)thirdValue).getSymbol());
073 singleFeatureValue.setCode(table.addSymbol(mergedValue.toString()));
074 singleFeatureValue.setKnown(table.getKnown(mergedValue.toString()));
075 singleFeatureValue.setSymbol(mergedValue.toString());
076 singleFeatureValue.setNullValue(false);
077 }
078 } else {
079 throw new FeatureException("It is not possible to merge Split features. ");
080 }
081 }
082
083 public Class<?>[] getParameterTypes() {
084 Class<?>[] paramTypes = { org.maltparser.core.feature.function.FeatureFunction.class,
085 org.maltparser.core.feature.function.FeatureFunction.class,
086 org.maltparser.core.feature.function.FeatureFunction.class };
087 return paramTypes;
088 }
089
090 public FeatureValue getFeatureValue() {
091 return singleFeatureValue;
092 }
093
094 public String getSymbol(int code) throws MaltChainedException {
095 return table.getSymbolCodeToString(code);
096 }
097
098 public int getCode(String symbol) throws MaltChainedException {
099 return table.getSymbolStringToCode(symbol);
100 }
101
102 public void updateCardinality() throws MaltChainedException {
103 firstFeature.updateCardinality();
104 secondFeature.updateCardinality();
105 thirdFeature.updateCardinality();
106 singleFeatureValue.setCardinality(table.getValueCounter());
107 }
108
109 public FeatureFunction getFirstFeature() {
110 return firstFeature;
111 }
112
113 public void setFirstFeature(FeatureFunction firstFeature) {
114 this.firstFeature = firstFeature;
115 }
116
117 public FeatureFunction getSecondFeature() {
118 return secondFeature;
119 }
120
121 public void setSecondFeature(FeatureFunction secondFeature) {
122 this.secondFeature = secondFeature;
123 }
124
125 public FeatureFunction getThirdFeature() {
126 return thirdFeature;
127 }
128
129 public void setThirdFeature(FeatureFunction thirdFeature) {
130 this.thirdFeature = thirdFeature;
131 }
132
133 public SymbolTableHandler getTableHandler() {
134 return tableHandler;
135 }
136
137 public void setTableHandler(SymbolTableHandler tableHandler) {
138 this.tableHandler = tableHandler;
139 }
140
141 public SymbolTable getSymbolTable() {
142 return table;
143 }
144
145 public void setSymbolTable(SymbolTable table) {
146 this.table = table;
147 }
148
149 public boolean equals(Object obj) {
150 if (this == obj)
151 return true;
152 if (obj == null)
153 return false;
154 if (getClass() != obj.getClass())
155 return false;
156 return obj.toString().equals(this.toString());
157 }
158
159 public String toString() {
160 final StringBuilder sb = new StringBuilder();
161 sb.append("Merge3(");
162 sb.append(firstFeature.toString());
163 sb.append(", ");
164 sb.append(secondFeature.toString());
165 sb.append(", ");
166 sb.append(thirdFeature.toString());
167 sb.append(')');
168 return sb.toString();
169 }
170 }