package org.elasticsearch.index.fields;
import org.apache.lucene.index.IndexableField;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.index.mapper.DocumentMapper;
import org.elasticsearch.index.mapper.ParseContext.Document;
import org.elasticsearch.index.mapper.object.ObjectMapper;
public final class DocumentParametersWrapper extends BaseScriptParametersWrapper
{
private final Document _doc;
private final DocumentMapper _mapper;
private final DocumentParametersWrapper _inner;
public DocumentParametersWrapper(Document doc, DocumentMapper mapper)
{
_doc = doc;
_mapper = mapper;
_inner = null;
}
private DocumentParametersWrapper(final DocumentParametersWrapper inner)
{
_doc = inner._doc;
_mapper = inner._mapper;
_inner = inner;
}
@Override
protected Document doc()
{
return _doc;
}
@Override
protected DocumentMapper mapper()
{
return _mapper;
}
@Override
protected boolean returnFieldData()
{
return _inner != null;
}
@Override
protected String path()
{
return null;
}
@Override
public Object get(Object key)
{
if (key == null) return null;
if (_doc == null) return null;
if (_mapper == null) return null;
try
{
ObjectMapper obj = _mapper.objectMappers().get(key);
if (obj != null)
{
return new FieldParametersWrapper(this, obj);
}
else
{
if ("doc".equals(key)) return new DocumentParametersWrapper(this);
if ("_source".equals(key))
{
IndexableField field = doc().getField((String)key);
if (field == null) return null;
return XContentHelper.convertToMap(new BytesArray(field.binaryValue()), false).v2();
}
return super.get(key);
}
}
catch (RuntimeException ex)
{
throw ex;
}
}
}