package org.elasticsearch.index.fields; import java.util.Collection; import java.util.Map; import java.util.Set; import org.apache.lucene.index.IndexableField; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.FieldMappers; import org.elasticsearch.index.mapper.ParseContext.Document; public abstract class BaseScriptParametersWrapper implements Map<String, Object> { protected abstract Document doc(); protected abstract DocumentMapper mapper(); protected abstract boolean returnFieldData(); protected abstract String path(); @Override public Object get(Object key) { String path = path(); if (path == null) path = (String)key; else path = path + "." + (String)key; if (returnFieldData()) { IndexableField[] fields = doc().getFields(path); if ((fields == null) || (fields.length == 0)) return new FieldData(); FieldMapper<?> fm = null; FieldMappers mappers = mapper().mappers().fullName(path); if ((mappers != null) && !mappers.isEmpty()) { fm = mappers.mapper(); } FieldData value = new FieldData(); value.values = new Object[fields.length]; for (int i = 0; i < fields.length; i++) { value.values[i] = fields[i].numericValue(); if (value.values[i] == null) value.values[i] = fields[i].stringValue(); if (fm != null) value.values[i] = fm.value(value.values[i]); } value.value = value.values[0]; return value; } else { IndexableField field = doc().getField(path); if (field == null) return null; Object value = field.numericValue(); if (value == null) value = field.stringValue(); FieldMappers mappers = mapper().mappers().fullName(path); if ((mappers != null) && !mappers.isEmpty()) { FieldMapper<?> mapper = mappers.mapper(); value = mapper.value(value); } return value; } } @Override public void clear() { throw new RuntimeException("not implemented"); } @Override public boolean containsKey(Object key) { if ("doc".equals(key)) return true; if ("_source".equals(key)) return true; String path = path(); if (path == null) path = (String)key; else path = path + "." + (String)key; return mapper().mappers().fullName(path) != null; } @Override public boolean containsValue(Object arg0) { throw new RuntimeException("not implemented"); } @Override public Set<java.util.Map.Entry<String, Object>> entrySet() { throw new RuntimeException("not implemented"); } @Override public boolean isEmpty() { throw new RuntimeException("not implemented"); } @Override public Set<String> keySet() { throw new RuntimeException("not implemented"); } @Override public Object put(String arg0, Object arg1) { throw new RuntimeException("not implemented"); } @Override public void putAll(Map<? extends String, ? extends Object> arg0) { throw new RuntimeException("not implemented"); } @Override public Object remove(Object arg0) { throw new RuntimeException("not implemented"); } @Override public int size() { throw new RuntimeException("not implemented"); } @Override public Collection<Object> values() { throw new RuntimeException("not implemented"); } public class FieldData { public Object[] values; public Object value; } }