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.MultipleFeatureValue;
009 import org.maltparser.core.feature.value.SingleFeatureValue;
010 import org.maltparser.core.io.dataformat.ColumnDescription;
011 import org.maltparser.core.io.dataformat.DataFormatInstance;
012 import org.maltparser.core.symbol.SymbolTable;
013 import org.maltparser.core.symbol.SymbolTableHandler;
014 /**
015 *
016 *
017 * @author Johan Hall
018 */
019 public class PrefixFeature implements FeatureMapFunction {
020 protected FeatureFunction parentFeature;
021 protected MultipleFeatureValue multipleFeatureValue;
022 protected SymbolTableHandler tableHandler;
023 protected SymbolTable table;
024 protected DataFormatInstance dataFormatInstance;
025 protected ColumnDescription column;
026 protected int prefixLength;
027
028 public PrefixFeature(DataFormatInstance dataFormatInstance) throws MaltChainedException {
029 super();
030 setDataFormatInstance(dataFormatInstance);
031 multipleFeatureValue = new MultipleFeatureValue(this);
032 }
033
034 public void initialize(Object[] arguments) throws MaltChainedException {
035 if (arguments.length != 2) {
036 throw new FeatureException("Could not initialize PrefixFeature: number of arguments are not correct. ");
037 }
038 if (!(arguments[0] instanceof FeatureFunction)) {
039 throw new FeatureException("Could not initialize PrefixFeature: the first argument is not a feature. ");
040 }
041 if (!(arguments[1] instanceof Integer)) {
042 throw new FeatureException("Could not initialize PrefixFeature: the second argument is not a string. ");
043 }
044 setParentFeature((FeatureFunction)arguments[0]);
045 setPrefixLength(((Integer)arguments[1]).intValue());
046 ColumnDescription parentColumn = dataFormatInstance.getColumnDescriptionByName(parentFeature.getSymbolTable().getName());
047 if (parentColumn.getType() != ColumnDescription.STRING) {
048 throw new FeatureException("Could not initialize PrefixFeature: the first argument must be a string. ");
049 }
050 setColumn(dataFormatInstance.addInternalColumnDescription("PREFIX_"+prefixLength+"_"+parentFeature.getSymbolTable().getName(), parentColumn));
051 setSymbolTable(column.getSymbolTable());
052 // setSymbolTable(tableHandler.addSymbolTable("PREFIX_"+prefixLength+"_"+parentFeature.getSymbolTable().getName(), parentFeature.getSymbolTable()));
053 }
054
055 public Class<?>[] getParameterTypes() {
056 Class<?>[] paramTypes = { org.maltparser.core.syntaxgraph.feature.InputColumnFeature.class, java.lang.Integer.class };
057 return paramTypes;
058 }
059
060 public FeatureValue getFeatureValue() {
061 return multipleFeatureValue;
062 }
063
064 public int getCode(String symbol) throws MaltChainedException {
065 return table.getSymbolStringToCode(symbol);
066 }
067
068 public String getSymbol(int code) throws MaltChainedException {
069 return table.getSymbolCodeToString(code);
070 }
071
072 public void update() throws MaltChainedException {
073 parentFeature.update();
074 FeatureValue value = parentFeature.getFeatureValue();
075 if (value instanceof SingleFeatureValue) {
076 String symbol = ((SingleFeatureValue)value).getSymbol();
077 if (((FeatureValue)value).isNullValue()) {
078 multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol);
079 multipleFeatureValue.setNullValue(true);
080 } else {
081 String prefixStr;
082 if (symbol.length()-prefixLength > 0) {
083 prefixStr = symbol.substring(0, prefixLength);
084 } else {
085 prefixStr = symbol;
086 }
087 int code = table.addSymbol(prefixStr);
088 multipleFeatureValue.addFeatureValue(code, prefixStr);
089 multipleFeatureValue.setNullValue(false);
090 }
091 } else if (value instanceof MultipleFeatureValue) {
092 multipleFeatureValue.reset();
093 if (((MultipleFeatureValue)value).isNullValue()) {
094 multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(((MultipleFeatureValue)value).getFirstSymbol()), ((MultipleFeatureValue)value).getFirstSymbol());
095 multipleFeatureValue.setNullValue(true);
096 } else {
097 for (String symbol : ((MultipleFeatureValue)value).getSymbols()) {
098 String prefixStr;
099 if (symbol.length()-prefixLength > 0) {
100 prefixStr = symbol.substring(0, prefixLength);
101 } else {
102 prefixStr = symbol;
103 }
104 int code = table.addSymbol(prefixStr);
105 multipleFeatureValue.addFeatureValue(code, prefixStr);
106 multipleFeatureValue.setNullValue(true);
107 }
108 }
109 }
110 }
111
112 public void updateCardinality() throws MaltChainedException {
113 // parentFeature.updateCardinality();
114 // multipleFeatureValue.setCardinality(table.getValueCounter());
115 }
116
117 public FeatureFunction getParentFeature() {
118 return parentFeature;
119 }
120
121 public void setParentFeature(FeatureFunction feature) {
122 this.parentFeature = feature;
123 }
124
125 public int getPrefixLength() {
126 return prefixLength;
127 }
128
129 public void setPrefixLength(int prefixLength) {
130 this.prefixLength = prefixLength;
131 }
132
133 public SymbolTableHandler getTableHandler() {
134 return dataFormatInstance.getSymbolTables();
135 }
136
137 public SymbolTable getSymbolTable() {
138 return table;
139 }
140
141 public void setSymbolTable(SymbolTable table) {
142 this.table = table;
143 }
144
145 public DataFormatInstance getDataFormatInstance() {
146 return dataFormatInstance;
147 }
148
149 public void setDataFormatInstance(DataFormatInstance dataFormatInstance) {
150 this.dataFormatInstance = dataFormatInstance;
151 }
152
153 public ColumnDescription getColumn() {
154 return column;
155 }
156
157 protected void setColumn(ColumnDescription column) {
158 this.column = column;
159 }
160
161 public int getType() {
162 return column.getType();
163 }
164
165 public String getMapIdentifier() {
166 return getSymbolTable().getName();
167 }
168
169 public boolean equals(Object obj) {
170 if (this == obj)
171 return true;
172 if (obj == null)
173 return false;
174 if (getClass() != obj.getClass())
175 return false;
176 return obj.toString().equals(this.toString());
177 }
178
179 public String toString() {
180 final StringBuilder sb = new StringBuilder();
181 sb.append("Prefix(");
182 sb.append(parentFeature.toString());
183 sb.append(", ");
184 sb.append(prefixLength);
185 sb.append(')');
186 return sb.toString();
187 }
188 }
189