Example usage for org.apache.solr.schema SchemaField write

List of usage examples for org.apache.solr.schema SchemaField write

Introduction

In this page you can find the example usage for org.apache.solr.schema SchemaField write.

Prototype

public void write(TextResponseWriter writer, String name, IndexableField val) throws IOException 

Source Link

Usage

From source file:com.mindquarry.search.solr.request.JSONWriter.java

License:Open Source License

public void writeDoc(String name, Collection<Fieldable> fields, Set<String> returnFields, Map pseudoFields)
        throws IOException {
    writer.write('{');
    incLevel();//ww w  . j av a  2  s  . c o m

    HashMap<String, MultiValueField> multi = new HashMap<String, MultiValueField>();

    boolean first = true;

    for (Fieldable ff : fields) {
        String fname = ff.name();
        if (returnFields != null && !returnFields.contains(fname)) {
            continue;
        }

        // if the field is multivalued, it may have other values further
        // on... so
        // build up a list for each multi-valued field.
        SchemaField sf = schema.getField(fname);
        if (sf.multiValued()) {
            MultiValueField mf = multi.get(fname);
            if (mf == null) {
                mf = new MultiValueField(sf, ff);
                multi.put(fname, mf);
            } else {
                mf.fields.add(ff);
            }
        } else {
            // not multi-valued, so write it immediately.
            if (first) {
                first = false;
            } else {
                writer.write(',');
            }
            indent();
            writeKey(fname, true);
            sf.write(this, fname, ff);
        }
    }

    for (MultiValueField mvf : multi.values()) {
        if (first) {
            first = false;
        } else {
            writer.write(',');
        }

        indent();
        writeKey(mvf.sfield.getName(), true);

        boolean indentArrElems = false;
        if (doIndent) {
            // heuristic... TextField is probably the only field type likely
            // to be long enough
            // to warrant indenting individual values.
            indentArrElems = (mvf.sfield.getType() instanceof TextField);
        }

        writer.write('[');
        boolean firstArrElem = true;
        incLevel();

        for (Fieldable ff : mvf.fields) {
            if (firstArrElem) {
                firstArrElem = false;
            } else {
                writer.write(',');
            }
            if (indentArrElems)
                indent();
            mvf.sfield.write(this, null, ff);
        }
        writer.write(']');
        decLevel();
    }

    if (pseudoFields != null && pseudoFields.size() > 0) {
        writeMap(null, pseudoFields, true, first);
    }

    decLevel();
    writer.write('}');
}