package com.github.obourgain.elasticsearch.http.handler.document.multiget;
import static org.elasticsearch.common.xcontent.XContentParser.Token.START_ARRAY;
import java.io.IOException;
import java.util.List;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import com.github.obourgain.elasticsearch.http.buffer.ByteBufBytesReference;
import com.github.obourgain.elasticsearch.http.handler.document.get.GetResponse;
import io.netty.buffer.ByteBuf;
import rx.Observable;
public class MultiGetResponse {
private Eithers<MultiGetResponseError, GetResponse> docs = new Eithers<>();
public List<MultiGetResponseError> errors() {
return docs.lefts();
}
public List<GetResponse> documents() {
return docs.rights();
}
public Eithers<MultiGetResponseError, GetResponse> all() {
return docs;
}
protected static Observable<MultiGetResponse> parse(ByteBuf content) {
return Observable.just(new MultiGetResponse().doParse(new ByteBufBytesReference(content)));
}
protected MultiGetResponse doParse(BytesReference bytesReference) {
try (XContentParser parser = XContentHelper.createParser(bytesReference)) {
XContentParser.Token token;
String currentFieldName = null;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else if (token.isValue()) {
assert currentFieldName != null;
} else if (token == XContentParser.Token.START_ARRAY) {
if ("docs".equals(currentFieldName)) {
parseDocs(parser);
}
}
}
return this;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected MultiGetResponse parseDocs(XContentParser parser) throws IOException {
assert parser.currentToken() == START_ARRAY : "expected a START_ARRAY token but was " + parser.currentToken();
XContentParser.Token token;
String currentFieldName = null;
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else if (token.isValue()) {
assert currentFieldName != null;
} else if (token == XContentParser.Token.START_OBJECT) {
docs.add(GetResponse.doParse(parser));
}
}
return this;
}
}