diff options
3 files changed, 83 insertions, 64 deletions
diff --git a/document/src/main/java/com/yahoo/document/ExtendedField.java b/document/src/main/java/com/yahoo/document/ExtendedField.java index 7bfab9dbaf6..55087d16974 100644 --- a/document/src/main/java/com/yahoo/document/ExtendedField.java +++ b/document/src/main/java/com/yahoo/document/ExtendedField.java @@ -25,7 +25,7 @@ public class ExtendedField extends Field { } public FieldValue setFieldValue(StructuredFieldValue doc, FieldValue fv) { FieldValue old = getFieldValue(doc); - extract.set(doc, fv.getWrappedValue()); + extract.set(doc, (fv == null) ? null : fv.getWrappedValue()); return old; } } diff --git a/document/src/main/java/com/yahoo/document/ExtendedStringField.java b/document/src/main/java/com/yahoo/document/ExtendedStringField.java new file mode 100644 index 00000000000..4fb052b9b56 --- /dev/null +++ b/document/src/main/java/com/yahoo/document/ExtendedStringField.java @@ -0,0 +1,47 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.document; + +import com.yahoo.document.annotation.SpanTree; +import com.yahoo.document.datatypes.FieldValue; +import com.yahoo.document.datatypes.StringFieldValue; +import com.yahoo.document.datatypes.StructuredFieldValue; +import java.util.Map; + +/** + * This adds an Extractor to the ExtendedField that can be used to get access the backed spantrees + * used in the concrete document types. + * @author baldersheim + */ +public class ExtendedStringField extends ExtendedField { + public static interface ExtractSpanTrees { + Map<String, SpanTree> get(StructuredFieldValue doc); + void set(StructuredFieldValue doc, Map<String, SpanTree> trees); + } + private final ExtractSpanTrees extractSpanTrees; + public ExtendedStringField(String name, DataType type, Extract extract, ExtractSpanTrees extractSpanTrees) { + super(name, type, extract); + this.extractSpanTrees = extractSpanTrees; + } + + @Override + public FieldValue getFieldValue(StructuredFieldValue doc) { + StringFieldValue sfv = (StringFieldValue) super.getFieldValue(doc); + Map<String, SpanTree> trees = extractSpanTrees.get(doc); + if (trees != null) { + for (SpanTree tree : trees.values()) { + sfv.setSpanTree(tree); + } + } + return sfv; + } + + @Override + public FieldValue setFieldValue(StructuredFieldValue doc, FieldValue fv) { + FieldValue old = getFieldValue(doc); + StringFieldValue sfv = (StringFieldValue) fv; + super.setFieldValue(doc, sfv); + extractSpanTrees.set(doc, (sfv == null) ? null : sfv.getSpanTreeMap()); + return old; + } + +} diff --git a/vespa-documentgen-plugin/src/main/java/com/yahoo/vespa/DocumentGenMojo.java b/vespa-documentgen-plugin/src/main/java/com/yahoo/vespa/DocumentGenMojo.java index e1e11e93fd8..8434f9b635a 100644 --- a/vespa-documentgen-plugin/src/main/java/com/yahoo/vespa/DocumentGenMojo.java +++ b/vespa-documentgen-plugin/src/main/java/com/yahoo/vespa/DocumentGenMojo.java @@ -534,11 +534,27 @@ public class DocumentGenMojo extends AbstractMojo { out.write(ind(ind+1) + "}\n"); out.write(ind(ind) + "));\n"); } + private static void addExtendedStringField(String className, Field f, Writer out, int ind) throws IOException { + out.write(ind(ind)+ "ret.addField(new com.yahoo.document.ExtendedStringField(\""+f.getName()+"\", " + toJavaReference(f.getDataType()) + ",\n"); + out.write(ind(ind+1) + "new com.yahoo.document.ExtendedField.Extract() {\n"); + out.write(ind(ind+2) + "public Object get(com.yahoo.document.datatypes.StructuredFieldValue doc) {return ((" + className + ")doc)." + getter(f.getName()) + "(); }\n"); + out.write(ind(ind+2) + "public void set(com.yahoo.document.datatypes.StructuredFieldValue doc, Object value) { ((" + className + ")doc)." + setter(f.getName())+"((" + toJavaType(f.getDataType()) + ")value); }\n"); + out.write(ind(ind+1) + "},\n"); + out.write(ind(ind+1) + "new com.yahoo.document.ExtendedStringField.ExtractSpanTrees() {\n"); + out.write(ind(ind+2) + "public java.util.Map<java.lang.String,com.yahoo.document.annotation.SpanTree> get(com.yahoo.document.datatypes.StructuredFieldValue doc) {return ((" + className + ")doc)." + spanTreeGetter(f.getName()) + "(); }\n"); + out.write(ind(ind+2) + "public void set(com.yahoo.document.datatypes.StructuredFieldValue doc, java.util.Map<java.lang.String,com.yahoo.document.annotation.SpanTree> value) { ((" + className + ")doc)." + spanTreeSetter(f.getName()) + "(value); }\n"); + out.write(ind(ind+1) + "}\n"); + out.write(ind(ind) + "));\n"); + } private static void exportExtendedStructTypeGetter(String className, String name, Collection<Field> fields, Writer out, int ind, String methodName, String retType) throws IOException { out.write(ind(ind)+"private static "+retType+" "+methodName+"() {\n" + ind(ind+1)+retType+" ret = new "+retType+"(\""+name+"\");\n"); for (Field f : fields) { - addExtendedField(className, f, out, ind + 1); + if (f.getDataType().equals(DataType.STRING)) { + addExtendedStringField(className, f, out, ind + 1); + } else { + addExtendedField(className, f, out, ind + 1); + } } out.write(ind(ind+1)+"return ret;\n"); out.write(ind(ind)+"}\n\n"); @@ -560,7 +576,7 @@ public class DocumentGenMojo extends AbstractMojo { */ private static void exportDocumentMethods(Collection<Field> fieldSet, Writer out, int ind) throws IOException { exportGetFieldCount(fieldSet, out, ind); - exportGetField(fieldSet, out, ind); + exportGetField(out, ind); exportGetFieldValue(fieldSet, out, ind); exportToNamedMap(out, ind); exportSetFieldValue(fieldSet, out, ind); @@ -617,63 +633,24 @@ public class DocumentGenMojo extends AbstractMojo { out.write(ind(ind+1)+"java.util.Map<com.yahoo.document.Field, com.yahoo.document.datatypes.FieldValue> ret = new java.util.HashMap<>();\n"); for (Field field: fieldSet) { String name = field.getName(); - out.write( - ind(ind+1)+"if ("+getter(name)+"()!=null) {\n" + - ind(ind+2)+"com.yahoo.document.Field f = getField(\""+name+"\");\n" + - ind(ind+2)+"com.yahoo.document.datatypes.FieldValue fv = ((com.yahoo.document.ExtendedField)f).getFieldValue(this);\n"); - if (field.getDataType().equals(DataType.STRING)) { - out.write( - ind(ind+2)+"if (fv instanceof com.yahoo.document.datatypes.StringFieldValue) if ("+spanTreeGetter(name)+"()!=null) {\n" + - ind(ind+3)+"for (com.yahoo.document.annotation.SpanTree tree : "+spanTreeGetter(name)+"().values()) ((com.yahoo.document.datatypes.StringFieldValue)fv).setSpanTree(tree);\n"+ - ind(ind+2)+"}\n"); - } - out.write(ind(ind+2)+"ret.put(f, fv);\n" + ind(ind+1)+"}\n"); - + out.write(ind(ind+1)+"if ("+getter(name)+"()!=null) {\n"); + out.write(ind(ind+2)+"com.yahoo.document.Field f = getField(\""+name+"\");\n"); + out.write(ind(ind+2)+"ret.put(f, ((com.yahoo.document.ExtendedField)f).getFieldValue(this));\n" + ind(ind+1)+"}\n"); } - out.write( - ind(ind+1)+"return ret.entrySet().iterator();\n" + + out.write(ind(ind+1)+"return ret.entrySet().iterator();\n" + ind(ind)+"}\n\n"); } private static void exportRemoveFieldValue(Collection<Field> fieldSet, Writer out, int ind) throws IOException { - out.write(ind(ind)+"@Override public com.yahoo.document.datatypes.FieldValue removeFieldValue(com.yahoo.document.Field field) {\n"); - out.write(ind(ind+1)+"if (field==null) return null;\n"); - for (Field field: fieldSet) { - String name = field.getName(); - out.write( - ind(ind+1)+"if (\""+name+"\".equals(field.getName())) {\n"); - out.write( - ind(ind+2)+"com.yahoo.document.datatypes.FieldValue ret = field.getDataType().createFieldValue("+getter(name)+"());\n"); - if (field.getDataType().equals(DataType.STRING)) { - out.write( - ind(ind+2)+"if (ret instanceof com.yahoo.document.datatypes.StringFieldValue) if ("+spanTreeGetter(name)+"()!=null) {\n" + - ind(ind+3)+"for (com.yahoo.document.annotation.SpanTree tree : "+spanTreeGetter(name)+"().values()) ((com.yahoo.document.datatypes.StringFieldValue)ret).setSpanTree(tree);\n"+ - ind(ind+3)+spanTreeSetter(name)+"(null);\n"+ - ind(ind+2)+"}\n"); - } - out.write( - ind(ind+2)+ setter(name)+"(null);\n" + - ind(ind+2)+"return ret;\n" + - ind(ind+1)+"}\n"); - } - out.write( - ind(ind+1)+"return super.removeFieldValue(field);\n" + - ind(ind)+"}\n\n"); + out.write(ind(ind) + "@Override public com.yahoo.document.datatypes.FieldValue removeFieldValue(com.yahoo.document.Field field) {\n"); + out.write(ind(ind+1) + "if (field==null) return null;\n"); + out.write(ind(ind+1) + "com.yahoo.document.ExtendedField ef = ensureExtended(field);\n"); + out.write(ind(ind+1) + "return (ef != null) ? ef.setFieldValue(this, null) : super.removeFieldValue(field);\n"); + out.write(ind(ind) + "}\n"); } private static void exportSetFieldValue(Collection<Field> fieldSet, Writer out, int ind) throws IOException { out.write(ind(ind)+"@Override public com.yahoo.document.datatypes.FieldValue setFieldValue(com.yahoo.document.Field field, com.yahoo.document.datatypes.FieldValue value) {\n"); - for (Field field: fieldSet) { - if (field.getDataType().equals(DataType.STRING)) { - String name = field.getName(); - out.write(ind(ind+1)+"if (\""+name+"\".equals(field.getName())) {\n"); - out.write(ind(ind + 2) + "if (value instanceof com.yahoo.document.datatypes.StringFieldValue) " + spanTreeSetter(name) + "(toNamedMap(((com.yahoo.document.datatypes.StringFieldValue)value).getSpanTrees()));\n"); - out.write(ind(ind + 2) + "com.yahoo.document.datatypes.FieldValue old=getFieldValue(field);\n"); - out.write(ind(ind + 2) + setter(name) + "((" + toJavaType(field.getDataType()) + ")value.getWrappedValue());\n"); - out.write(ind(ind + 2) + "return old;\n"); - out.write(ind(ind + 1) + "}\n"); - } - } out.write(ind(ind+1)+"com.yahoo.document.ExtendedField ef = ensureExtended(field);\n"); out.write(ind(ind+1)+"return (ef != null) ? ef.setFieldValue(this, value) : super.setFieldValue(field, value);\n"); out.write(ind(ind)+"}\n\n"); @@ -682,29 +659,24 @@ public class DocumentGenMojo extends AbstractMojo { private static void exportGetFieldValue(Collection<Field> fieldSet, Writer out, int ind) throws IOException { out.write(ind(ind)+"@Override public com.yahoo.document.datatypes.FieldValue getFieldValue(com.yahoo.document.Field field) {\n"); out.write(ind(ind+1)+"if (field==null) return null;\n"); + out.write(ind(ind+1)+"if (field.getDataType() instanceof com.yahoo.document.StructDataType) {\n"); for (Field field: fieldSet) { String name = field.getName(); - if (field.getDataType().equals(DataType.STRING)) { - out.write( - ind(ind+1)+"if (\""+name+"\".equals(field.getName())) {\n"+ - ind(ind+2)+"if ("+getter(name)+"()==null) return null;\n" + - ind(ind+2)+"com.yahoo.document.datatypes.FieldValue fv = field.getDataType().createFieldValue("+getter(name)+"());\n" + - ind(ind+2)+"if (!(fv instanceof com.yahoo.document.datatypes.StringFieldValue)) return fv;\n"+ // Should never happen - ind(ind+2)+"com.yahoo.document.datatypes.StringFieldValue ret = (com.yahoo.document.datatypes.StringFieldValue)fv;\n" + - ind(ind+2)+"if ("+spanTreeGetter(name)+"()!=null) for (java.util.Map.Entry<java.lang.String,com.yahoo.document.annotation.SpanTree> tree : "+spanTreeGetter(name)+"().entrySet()) ret.setSpanTree(tree.getValue());\n" + - ind(ind+2)+"return ret;\n" + - ind(ind+1)+"}\n"); - } else if (field.getDataType() instanceof StructDataType) { - out.write(ind(ind+1)+"if (\""+name+"\".equals(field.getName())) return "+name+";\n"); + if (field.getDataType() instanceof StructDataType) { + out.write(ind(ind+2)+"if (\""+name+"\".equals(field.getName())) return "+name+";\n"); } } + out.write(ind(ind+1)+"}\n"); out.write(ind(ind+1)+"com.yahoo.document.ExtendedField ef = ensureExtended(field);\n"); out.write(ind(ind+1)+"return (ef != null) ? ef.getFieldValue(this) : super.getFieldValue(field);\n"); out.write(ind(ind)+"}\n\n"); } - private static void exportGetField(Collection<Field> fieldSet, Writer out, int ind) throws IOException { + private static void exportGetField(Writer out, int ind) throws IOException { + out.write(ind(ind) + "private com.yahoo.document.ExtendedStringField ensureExtendedString(com.yahoo.document.Field f) {\n"); + out.write(ind(ind+1) + "return (com.yahoo.document.ExtendedStringField)((f instanceof com.yahoo.document.ExtendedStringField) ? f : getField(f.getName()));\n"); + out.write(ind(ind) + "}\n\n"); out.write(ind(ind) + "private com.yahoo.document.ExtendedField ensureExtended(com.yahoo.document.Field f) {\n"); out.write(ind(ind+1) + "return (com.yahoo.document.ExtendedField)((f instanceof com.yahoo.document.ExtendedField) ? f : getField(f.getName()));\n"); out.write(ind(ind) + "}\n\n"); |