EQL: Remove list classes from EqlSearchResponse (#50870)
Removes unnecessary classes from EqlSearchResponse that just represent lists of other elements. Relates to #49581
This commit is contained in:
parent
d715176c00
commit
88cc30c0d8
|
@ -24,7 +24,6 @@ import org.elasticsearch.search.SearchHits;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -36,44 +35,43 @@ import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpect
|
||||||
* Response to perform an eql search
|
* Response to perform an eql search
|
||||||
*
|
*
|
||||||
* Example events response:
|
* Example events response:
|
||||||
* EqlSearchResponse.Events events = new EqlSearchResponse.Events(new SearchHit[]{
|
* List<SearchHit> events = Arrays.asList(
|
||||||
* new SearchHit(1, "111", null),
|
* new SearchHit(1, "111", null),
|
||||||
* new SearchHit(2, "222", null),
|
* new SearchHit(2, "222", null)
|
||||||
* });
|
* );
|
||||||
*
|
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(Arrays.asList(
|
||||||
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(events, new TotalHits(100, TotalHits.Relation.EQUAL_TO));
|
* new EqlSearchResponse.Sequence(Collections.singletonList("4021"), events),
|
||||||
|
* new EqlSearchResponse.Sequence(Collections.singletonList("2343"), events)
|
||||||
|
* ), null, null, new TotalHits(0, TotalHits.Relation.EQUAL_TO));
|
||||||
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Example sequence response:
|
* Example sequence response:
|
||||||
* EqlSearchResponse.Events events1 = new EqlSearchResponse.Events(new SearchHit[]{
|
* List<SearchHit> events1 = Arrays.asList(
|
||||||
* new SearchHit(1, "111", null),
|
* new SearchHit(1, "111", null),
|
||||||
* new SearchHit(2, "222", null),
|
* new SearchHit(2, "222", null)
|
||||||
* });
|
* );
|
||||||
* EqlSearchResponse.Events events2 = new EqlSearchResponse.Events(new SearchHit[]{
|
* List<SearchHit> events2 = Arrays.asList(
|
||||||
* new SearchHit(3, "333", null),
|
* new SearchHit(1, "333", null),
|
||||||
* new SearchHit(4, "444", null),
|
* new SearchHit(2, "444", null)
|
||||||
* });
|
* );
|
||||||
* EqlSearchResponse.Sequences sequences = new EqlSearchResponse.Sequences(
|
* List<Sequence> sequences = Arrays.asList(
|
||||||
* new EqlSearchResponse.Sequence[]{
|
|
||||||
* new EqlSearchResponse.Sequence(new String[]{"4021"}, events1),
|
* new EqlSearchResponse.Sequence(new String[]{"4021"}, events1),
|
||||||
* new EqlSearchResponse.Sequence(new String[]{"2343"}, events2)
|
* new EqlSearchResponse.Sequence(new String[]{"2343"}, events2)
|
||||||
* });
|
* );
|
||||||
*
|
*
|
||||||
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(sequences, new TotalHits(100, TotalHits.Relation.EQUAL_TO));
|
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(null, sequences, null, new TotalHits(100, TotalHits.Relation.EQUAL_TO));
|
||||||
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Example count response:
|
* Example count response:
|
||||||
* TotalHits totals = new TotalHits(100, TotalHits.Relation.EQUAL_TO);
|
* TotalHits totals = new TotalHits(100, TotalHits.Relation.EQUAL_TO);
|
||||||
* EqlSearchResponse.Counts counts = new EqlSearchResponse.Counts(
|
* List<Count> counts = Arrays.asList(
|
||||||
* new EqlSearchResponse.Count[]{
|
|
||||||
* new EqlSearchResponse.Count(40, new String[]{"foo", "bar"}, .42233f),
|
* new EqlSearchResponse.Count(40, new String[]{"foo", "bar"}, .42233f),
|
||||||
* new EqlSearchResponse.Count(15, new String[]{"foo", "bar"}, .170275f),
|
* new EqlSearchResponse.Count(15, new String[]{"foo", "bar"}, .170275f)
|
||||||
* }
|
|
||||||
* );
|
* );
|
||||||
*
|
*
|
||||||
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(counts, totals);
|
* EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(null, null, counts, totals);
|
||||||
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
* EqlSearchResponse response = new EqlSearchResponse(hits, 5, false);
|
||||||
*/
|
*/
|
||||||
public class EqlSearchResponse extends ActionResponse implements ToXContentObject {
|
public class EqlSearchResponse extends ActionResponse implements ToXContentObject {
|
||||||
|
@ -188,17 +186,18 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
public static class Sequence implements Writeable, ToXContentObject {
|
public static class Sequence implements Writeable, ToXContentObject {
|
||||||
private static final class Fields {
|
private static final class Fields {
|
||||||
static final String JOIN_KEYS = "join_keys";
|
static final String JOIN_KEYS = "join_keys";
|
||||||
|
static final String EVENTS = "events";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final ParseField JOIN_KEYS = new ParseField(Fields.JOIN_KEYS);
|
private static final ParseField JOIN_KEYS = new ParseField(Fields.JOIN_KEYS);
|
||||||
private static final ParseField EVENTS = new ParseField(Events.NAME);
|
private static final ParseField EVENTS = new ParseField(Fields.EVENTS);
|
||||||
|
|
||||||
private static final ConstructingObjectParser<EqlSearchResponse.Sequence, Void> PARSER =
|
private static final ConstructingObjectParser<EqlSearchResponse.Sequence, Void> PARSER =
|
||||||
new ConstructingObjectParser<>("eql/search_response_sequence", true,
|
new ConstructingObjectParser<>("eql/search_response_sequence", true,
|
||||||
args -> {
|
args -> {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@SuppressWarnings("unchecked") List<String> joinKeys = (List<String>) args[i++];
|
@SuppressWarnings("unchecked") List<String> joinKeys = (List<String>) args[i++];
|
||||||
@SuppressWarnings("unchecked") Events events = new Events(((List<SearchHit>) args[i]).toArray(new SearchHit[0]));
|
@SuppressWarnings("unchecked") List<SearchHit> events = (List<SearchHit>) args[i];
|
||||||
return new EqlSearchResponse.Sequence(joinKeys, events);
|
return new EqlSearchResponse.Sequence(joinKeys, events);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -208,16 +207,16 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
}
|
}
|
||||||
|
|
||||||
private final List<String> joinKeys;
|
private final List<String> joinKeys;
|
||||||
private final Events events;
|
private final List<SearchHit> events;
|
||||||
|
|
||||||
public Sequence(List<String> joinKeys, Events events) {
|
public Sequence(List<String> joinKeys, List<SearchHit> events) {
|
||||||
this.joinKeys = joinKeys == null ? Collections.emptyList() : joinKeys;
|
this.joinKeys = joinKeys == null ? Collections.emptyList() : joinKeys;
|
||||||
this.events = events == null ? Events.EMPTY : events;
|
this.events = events == null ? Collections.emptyList() : events;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Sequence(StreamInput in) throws IOException {
|
public Sequence(StreamInput in) throws IOException {
|
||||||
this.joinKeys = in.readStringList();
|
this.joinKeys = in.readStringList();
|
||||||
this.events = new Events(in);
|
this.events = in.readList(SearchHit::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Sequence fromXContent(XContentParser parser) {
|
public static Sequence fromXContent(XContentParser parser) {
|
||||||
|
@ -227,27 +226,22 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
out.writeStringCollection(joinKeys);
|
out.writeStringCollection(joinKeys);
|
||||||
out.writeVInt(events.entries().length);
|
out.writeList(events);
|
||||||
if (events.entries().length > 0) {
|
|
||||||
for (SearchHit hit : events.entries()) {
|
|
||||||
hit.writeTo(out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.startObject();
|
builder.startObject();
|
||||||
if (joinKeys != null) {
|
if (joinKeys.isEmpty() == false) {
|
||||||
builder.startArray(Fields.JOIN_KEYS);
|
builder.field(Fields.JOIN_KEYS, joinKeys);
|
||||||
for(String s : joinKeys) {
|
}
|
||||||
builder.value(s);
|
if (events.isEmpty() == false) {
|
||||||
|
builder.startArray(EVENTS.getPreferredName());
|
||||||
|
for (SearchHit event : events) {
|
||||||
|
event.toXContent(builder, params);
|
||||||
}
|
}
|
||||||
builder.endArray();
|
builder.endArray();
|
||||||
}
|
}
|
||||||
if (events != null) {
|
|
||||||
events.toXContent(builder, params);
|
|
||||||
}
|
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
@ -356,184 +350,41 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base class for serialized collection of entries (events, sequences, counts)
|
|
||||||
private abstract static class Entries<T extends Writeable & ToXContentObject> implements Writeable, ToXContentFragment {
|
|
||||||
private final String name;
|
|
||||||
private final T[] entries;
|
|
||||||
|
|
||||||
Entries(String name, T[] entries) {
|
|
||||||
this.name = name;
|
|
||||||
if (entries == null) {
|
|
||||||
this.entries = createEntriesArray(0);
|
|
||||||
} else {
|
|
||||||
this.entries = entries;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Entries(String name, StreamInput in) throws IOException {
|
|
||||||
this.name = name;
|
|
||||||
int size = in.readVInt();
|
|
||||||
entries = createEntriesArray(size);
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
entries[i] = createEntry(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
out.writeVInt(entries.length);
|
|
||||||
if (entries.length > 0) {
|
|
||||||
for (T e : entries) {
|
|
||||||
e.writeTo(out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
|
||||||
builder.startArray(name);
|
|
||||||
if (entries != null) {
|
|
||||||
for (T e : entries) {
|
|
||||||
e.toXContent(builder, params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
builder.endArray();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T[] entries() {
|
|
||||||
return entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Entries<?> that = (Entries<?>) o;
|
|
||||||
return Arrays.deepEquals(entries, that.entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Arrays.hashCode(entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract T[] createEntriesArray(int size);
|
|
||||||
protected abstract T createEntry(StreamInput in) throws IOException;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Events
|
|
||||||
public static class Events extends EqlSearchResponse.Entries<SearchHit> {
|
|
||||||
private static final Events EMPTY = new Events((SearchHit[]) null);
|
|
||||||
private static final String NAME = "events";
|
|
||||||
|
|
||||||
public Events(SearchHit[] entries) {
|
|
||||||
super(NAME, entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Events(StreamInput in) throws IOException {
|
|
||||||
super(NAME, in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final SearchHit[] createEntriesArray(int size) {
|
|
||||||
return new SearchHit[size];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final SearchHit createEntry(StreamInput in) throws IOException {
|
|
||||||
return new SearchHit(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sequences
|
|
||||||
public static class Sequences extends EqlSearchResponse.Entries<EqlSearchResponse.Sequence> {
|
|
||||||
private static String NAME = "sequences";
|
|
||||||
|
|
||||||
public Sequences(Sequence[] entries) {
|
|
||||||
super(NAME, entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Sequences(StreamInput in) throws IOException {
|
|
||||||
super(NAME, in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final Sequence[] createEntriesArray(int size) {
|
|
||||||
return new Sequence[size];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final Sequence createEntry(StreamInput in) throws IOException {
|
|
||||||
return new Sequence(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Counts
|
|
||||||
public static class Counts extends EqlSearchResponse.Entries<EqlSearchResponse.Count> {
|
|
||||||
private static String NAME = "counts";
|
|
||||||
public Counts(Count[] entries) {
|
|
||||||
super(NAME, entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Counts(StreamInput in) throws IOException {
|
|
||||||
super(NAME, in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final Count[] createEntriesArray(int size) {
|
|
||||||
return new Count[size];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected final Count createEntry(StreamInput in) throws IOException {
|
|
||||||
return new Count(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hits
|
// Hits
|
||||||
public static class Hits implements Writeable, ToXContentFragment {
|
public static class Hits implements Writeable, ToXContentFragment {
|
||||||
public static final Hits EMPTY = new Hits((Events)null, null);
|
public static final Hits EMPTY = new Hits(null, null, null, null);
|
||||||
|
|
||||||
private Events events = null;
|
private final List<SearchHit> events;
|
||||||
private Sequences sequences = null;
|
private final List<Sequence> sequences;
|
||||||
private Counts counts = null;
|
private final List<Count> counts;
|
||||||
private TotalHits totalHits;
|
private final TotalHits totalHits;
|
||||||
|
|
||||||
private static final class Fields {
|
private static final class Fields {
|
||||||
static final String HITS = "hits";
|
static final String HITS = "hits";
|
||||||
static final String TOTAL = "total";
|
static final String TOTAL = "total";
|
||||||
|
static final String EVENTS = "events";
|
||||||
|
static final String SEQUENCES = "sequences";
|
||||||
|
static final String COUNTS = "counts";
|
||||||
}
|
}
|
||||||
|
|
||||||
public Hits(Events events, @Nullable TotalHits totalHits) {
|
public Hits(@Nullable List<SearchHit> events, @Nullable List<Sequence> sequences, @Nullable List<Count> counts,
|
||||||
|
@Nullable TotalHits totalHits) {
|
||||||
this.events = events;
|
this.events = events;
|
||||||
this.totalHits = totalHits;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Hits(Sequences sequences, @Nullable TotalHits totalHits) {
|
|
||||||
this.sequences = sequences;
|
this.sequences = sequences;
|
||||||
this.totalHits = totalHits;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Hits(Counts counts, @Nullable TotalHits totalHits) {
|
|
||||||
this.counts = counts;
|
this.counts = counts;
|
||||||
this.totalHits = totalHits;
|
this.totalHits = totalHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Hits(StreamInput in) throws IOException {
|
public Hits(StreamInput in) throws IOException {
|
||||||
if (in.readBoolean()) {
|
if (in.readBoolean()) {
|
||||||
totalHits = Lucene.readTotalHits(in);
|
totalHits = Lucene.readTotalHits(in);
|
||||||
} else {
|
} else {
|
||||||
totalHits = null;
|
totalHits = null;
|
||||||
}
|
}
|
||||||
|
events = in.readBoolean() ? in.readList(SearchHit::new) : null;
|
||||||
events = in.readBoolean() ? new Events(in) : null;
|
sequences = in.readBoolean() ? in.readList(Sequence::new) : null;
|
||||||
sequences = in.readBoolean() ? new Sequences(in) : null;
|
counts = in.readBoolean() ? in.readList(Count::new) : null;
|
||||||
counts = in.readBoolean() ? new Counts(in) : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -543,9 +394,24 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
if (hasTotalHits) {
|
if (hasTotalHits) {
|
||||||
Lucene.writeTotalHits(out, totalHits);
|
Lucene.writeTotalHits(out, totalHits);
|
||||||
}
|
}
|
||||||
out.writeOptionalWriteable(events);
|
if (events != null) {
|
||||||
out.writeOptionalWriteable(sequences);
|
out.writeBoolean(true);
|
||||||
out.writeOptionalWriteable(counts);
|
out.writeList(events);
|
||||||
|
} else {
|
||||||
|
out.writeBoolean(false);
|
||||||
|
}
|
||||||
|
if (sequences != null) {
|
||||||
|
out.writeBoolean(true);
|
||||||
|
out.writeList(sequences);
|
||||||
|
} else {
|
||||||
|
out.writeBoolean(false);
|
||||||
|
}
|
||||||
|
if (counts != null) {
|
||||||
|
out.writeBoolean(true);
|
||||||
|
out.writeList(counts);
|
||||||
|
} else {
|
||||||
|
out.writeBoolean(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Hits fromXContent(XContentParser parser) throws IOException {
|
public static Hits fromXContent(XContentParser parser) throws IOException {
|
||||||
|
@ -568,17 +434,17 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
totalHits = new TotalHits(parser.longValue(), TotalHits.Relation.EQUAL_TO);
|
totalHits = new TotalHits(parser.longValue(), TotalHits.Relation.EQUAL_TO);
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
if (Events.NAME.equals(currentFieldName)) {
|
if (Fields.EVENTS.equals(currentFieldName)) {
|
||||||
searchHits = new ArrayList<>();
|
searchHits = new ArrayList<>();
|
||||||
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
||||||
searchHits.add(SearchHit.fromXContent(parser));
|
searchHits.add(SearchHit.fromXContent(parser));
|
||||||
}
|
}
|
||||||
} else if (Sequences.NAME.equals(currentFieldName)) {
|
} else if (Fields.SEQUENCES.equals(currentFieldName)) {
|
||||||
sequences = new ArrayList<>();
|
sequences = new ArrayList<>();
|
||||||
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
||||||
sequences.add(Sequence.fromXContent(parser));
|
sequences.add(Sequence.fromXContent(parser));
|
||||||
}
|
}
|
||||||
} else if (Counts.NAME.equals(currentFieldName)) {
|
} else if (Fields.COUNTS.equals(currentFieldName)) {
|
||||||
counts = new ArrayList<>();
|
counts = new ArrayList<>();
|
||||||
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
||||||
counts.add(Count.fromXContent(parser));
|
counts.add(Count.fromXContent(parser));
|
||||||
|
@ -594,17 +460,7 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return new EqlSearchResponse.Hits(searchHits, sequences, counts, totalHits);
|
||||||
if (searchHits != null) {
|
|
||||||
return new EqlSearchResponse.Hits(new EqlSearchResponse.Events(searchHits.toArray(new SearchHit[searchHits.size()])),
|
|
||||||
totalHits);
|
|
||||||
} else if (sequences != null) {
|
|
||||||
return new EqlSearchResponse.Hits(new EqlSearchResponse.Sequences(sequences.toArray(new Sequence[sequences.size()])),
|
|
||||||
totalHits);
|
|
||||||
} else if (counts != null) {
|
|
||||||
return new EqlSearchResponse.Hits(new EqlSearchResponse.Counts(counts.toArray(new Count[counts.size()])), totalHits);
|
|
||||||
}
|
|
||||||
return new EqlSearchResponse.Hits((Events)null, totalHits);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -617,13 +473,17 @@ public class EqlSearchResponse extends ActionResponse implements ToXContentObjec
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
if (events != null) {
|
if (events != null) {
|
||||||
events.toXContent(builder, params);
|
builder.startArray(Fields.EVENTS);
|
||||||
|
for (SearchHit event : events) {
|
||||||
|
event.toXContent(builder, params);
|
||||||
|
}
|
||||||
|
builder.endArray();
|
||||||
}
|
}
|
||||||
if (sequences != null) {
|
if (sequences != null) {
|
||||||
sequences.toXContent(builder, params);
|
builder.field(Fields.SEQUENCES, sequences);
|
||||||
}
|
}
|
||||||
if (counts != null) {
|
if (counts != null) {
|
||||||
counts.toXContent(builder, params);
|
builder.field(Fields.COUNTS, counts);
|
||||||
}
|
}
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,9 @@ import org.elasticsearch.xpack.eql.action.EqlSearchAction;
|
||||||
import org.elasticsearch.xpack.eql.action.EqlSearchRequest;
|
import org.elasticsearch.xpack.eql.action.EqlSearchRequest;
|
||||||
import org.elasticsearch.xpack.eql.action.EqlSearchResponse;
|
import org.elasticsearch.xpack.eql.action.EqlSearchResponse;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class TransportEqlSearchAction extends HandledTransportAction<EqlSearchRequest, EqlSearchResponse> {
|
public class TransportEqlSearchAction extends HandledTransportAction<EqlSearchRequest, EqlSearchResponse> {
|
||||||
private final SecurityContext securityContext;
|
private final SecurityContext securityContext;
|
||||||
|
@ -51,14 +53,14 @@ public class TransportEqlSearchAction extends HandledTransportAction<EqlSearchRe
|
||||||
static EqlSearchResponse createResponse(EqlSearchRequest request) {
|
static EqlSearchResponse createResponse(EqlSearchRequest request) {
|
||||||
// Stubbed search response
|
// Stubbed search response
|
||||||
// TODO: implement actual search response processing once the parser/executor is in place
|
// TODO: implement actual search response processing once the parser/executor is in place
|
||||||
EqlSearchResponse.Events events = new EqlSearchResponse.Events(new SearchHit[]{
|
List<SearchHit> events = Arrays.asList(
|
||||||
new SearchHit(1, "111", null),
|
new SearchHit(1, "111", null),
|
||||||
new SearchHit(2, "222", null),
|
new SearchHit(2, "222", null)
|
||||||
});
|
);
|
||||||
EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(new EqlSearchResponse.Sequences(new EqlSearchResponse.Sequence[]{
|
EqlSearchResponse.Hits hits = new EqlSearchResponse.Hits(null, Arrays.asList(
|
||||||
new EqlSearchResponse.Sequence(Collections.singletonList("4021"), events),
|
new EqlSearchResponse.Sequence(Collections.singletonList("4021"), events),
|
||||||
new EqlSearchResponse.Sequence(Collections.singletonList("2343"), events)
|
new EqlSearchResponse.Sequence(Collections.singletonList("2343"), events)
|
||||||
}), new TotalHits(0, TotalHits.Relation.EQUAL_TO));
|
), null, new TotalHits(0, TotalHits.Relation.EQUAL_TO));
|
||||||
return new EqlSearchResponse(hits, 0, false);
|
return new EqlSearchResponse(hits, 0, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,23 +11,24 @@ import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
import org.elasticsearch.test.AbstractSerializingTestCase;
|
import org.elasticsearch.test.AbstractSerializingTestCase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class EqlSearchResponseTests extends AbstractSerializingTestCase<EqlSearchResponse> {
|
public class EqlSearchResponseTests extends AbstractSerializingTestCase<EqlSearchResponse> {
|
||||||
|
|
||||||
static EqlSearchResponse.Events randomEvents() {
|
static List<SearchHit> randomEvents() {
|
||||||
int size = randomIntBetween(1, 10);
|
int size = randomIntBetween(1, 10);
|
||||||
SearchHit[] hits = null;
|
List<SearchHit> hits = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
hits = new SearchHit[size];
|
hits = new ArrayList<>();
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
hits[i] = new SearchHit(i, randomAlphaOfLength(10), new HashMap<>());
|
hits.add(new SearchHit(i, randomAlphaOfLength(10), new HashMap<>()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
return new EqlSearchResponse.Events(hits);
|
return hits;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -49,55 +50,47 @@ public class EqlSearchResponseTests extends AbstractSerializingTestCase<EqlSearc
|
||||||
public static EqlSearchResponse createRandomEventsResponse(TotalHits totalHits) {
|
public static EqlSearchResponse createRandomEventsResponse(TotalHits totalHits) {
|
||||||
EqlSearchResponse.Hits hits = null;
|
EqlSearchResponse.Hits hits = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
hits = new EqlSearchResponse.Hits(randomEvents(), totalHits);
|
hits = new EqlSearchResponse.Hits(randomEvents(), null, null, totalHits);
|
||||||
}
|
}
|
||||||
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EqlSearchResponse createRandomSequencesResponse(TotalHits totalHits) {
|
public static EqlSearchResponse createRandomSequencesResponse(TotalHits totalHits) {
|
||||||
int size = randomIntBetween(1, 10);
|
int size = randomIntBetween(1, 10);
|
||||||
EqlSearchResponse.Sequence[] seq = null;
|
List<EqlSearchResponse.Sequence> seq = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
seq = new EqlSearchResponse.Sequence[size];
|
seq = new ArrayList<>();
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
List<String> joins = null;
|
List<String> joins = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
joins = Arrays.asList(generateRandomStringArray(6, 11, false));
|
joins = Arrays.asList(generateRandomStringArray(6, 11, false));
|
||||||
}
|
}
|
||||||
seq[i] = new EqlSearchResponse.Sequence(joins, randomEvents());
|
seq.add(new EqlSearchResponse.Sequence(joins, randomEvents()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EqlSearchResponse.Sequences sequences = null;
|
|
||||||
if (randomBoolean()) {
|
|
||||||
sequences = new EqlSearchResponse.Sequences(seq);
|
|
||||||
}
|
|
||||||
EqlSearchResponse.Hits hits = null;
|
EqlSearchResponse.Hits hits = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
hits = new EqlSearchResponse.Hits(sequences, totalHits);
|
hits = new EqlSearchResponse.Hits(null, seq, null, totalHits);
|
||||||
}
|
}
|
||||||
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EqlSearchResponse createRandomCountResponse(TotalHits totalHits) {
|
public static EqlSearchResponse createRandomCountResponse(TotalHits totalHits) {
|
||||||
int size = randomIntBetween(1, 10);
|
int size = randomIntBetween(1, 10);
|
||||||
EqlSearchResponse.Count[] cn = null;
|
List<EqlSearchResponse.Count> cn = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
cn = new EqlSearchResponse.Count[size];
|
cn = new ArrayList<>();
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
List<String> keys = null;
|
List<String> keys = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
keys = Arrays.asList(generateRandomStringArray(6, 11, false));
|
keys = Arrays.asList(generateRandomStringArray(6, 11, false));
|
||||||
}
|
}
|
||||||
cn[i] = new EqlSearchResponse.Count(randomIntBetween(0, 41), keys, randomFloat());
|
cn.add(new EqlSearchResponse.Count(randomIntBetween(0, 41), keys, randomFloat()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EqlSearchResponse.Counts counts = null;
|
|
||||||
if (randomBoolean()) {
|
|
||||||
counts = new EqlSearchResponse.Counts(cn);
|
|
||||||
}
|
|
||||||
EqlSearchResponse.Hits hits = null;
|
EqlSearchResponse.Hits hits = null;
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
hits = new EqlSearchResponse.Hits(counts, totalHits);
|
hits = new EqlSearchResponse.Hits(null, null, cn, totalHits);
|
||||||
}
|
}
|
||||||
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
return new EqlSearchResponse(hits, randomIntBetween(0, 1001), randomBoolean());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue