Skip to content

Commit 7259789

Browse files
committed
Use sorted set to store targets for views
Signed-off-by: Peter Nied <peternied@hotmail.com>
1 parent db8f049 commit 7259789

File tree

6 files changed

+51
-14
lines changed

6 files changed

+51
-14
lines changed

server/src/internalClusterTest/java/org/opensearch/action/admin/indices/view/ViewIT.java

+14
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ public void testCreateView() throws Exception {
4141
MatcherAssert.assertThat(ex.getMessage(), is("View [" + viewName + "] already exists"));
4242
}
4343

44+
public void testCreateViewTargetsSet() throws Exception {
45+
final String viewName = randomAlphaOfLength(8);
46+
final String indexPattern = "a" + randomAlphaOfLength(8);
47+
final String indexPattern2 = "b" + randomAlphaOfLength(8);
48+
final List<String> targetPatterns = List.of(indexPattern2, indexPattern, indexPattern);
49+
50+
logger.info("Testing createView with targets that will be reordered and deduplicated");
51+
final View view = createView(viewName, targetPatterns).getView();
52+
MatcherAssert.assertThat(view.getName(), is(viewName));
53+
MatcherAssert.assertThat(view.getTargets().size(), is(2));
54+
MatcherAssert.assertThat(view.getTargets().first().getIndexPattern(), is(indexPattern));
55+
MatcherAssert.assertThat(view.getTargets().last().getIndexPattern(), is(indexPattern2));
56+
}
57+
4458
public void testGetView() throws Exception {
4559
final String viewName = randomAlphaOfLength(8);
4660
createView(viewName, randomAlphaOfLength(8));

server/src/internalClusterTest/java/org/opensearch/action/admin/indices/view/ViewTestBase.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,14 @@ protected int createIndexWithDocs(final String indexName) throws Exception {
3434
}
3535

3636
protected GetViewAction.Response createView(final String name, final String indexPattern) throws Exception {
37+
return createView(name, List.of(indexPattern));
38+
}
39+
40+
protected GetViewAction.Response createView(final String name, final List<String> targets) throws Exception {
3741
final CreateViewAction.Request request = new CreateViewAction.Request(
3842
name,
3943
null,
40-
List.of(new CreateViewAction.Request.Target(indexPattern))
44+
targets.stream().map(CreateViewAction.Request.Target::new).collect(Collectors.toList())
4145
);
4246
return client().admin().indices().createView(request).actionGet();
4347
}

server/src/main/java/org/opensearch/action/admin/indices/view/CreateViewAction.java

-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ public ActionRequestValidationException validate() {
124124
if (CollectionUtils.isEmpty(targets)) {
125125
validationException = ValidateActions.addValidationError("targets cannot be empty", validationException);
126126
} else {
127-
System.out.println("targets.size()" + targets.size());
128127
if (targets.size() > MAX_TARGET_COUNT) {
129128
validationException = ValidateActions.addValidationError(
130129
"view cannot have more than " + MAX_TARGET_COUNT + " targets",

server/src/main/java/org/opensearch/action/admin/indices/view/ViewService.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.List;
2727
import java.util.Map;
2828
import java.util.Optional;
29+
import java.util.TreeSet;
2930
import java.util.function.LongSupplier;
3031
import java.util.stream.Collectors;
3132

@@ -51,7 +52,7 @@ public void createView(final CreateViewAction.Request request, final ActionListe
5152
.stream()
5253
.map(target -> new View.Target(target.getIndexPattern()))
5354
.collect(Collectors.toList());
54-
final View view = new View(request.getName(), request.getDescription(), currentTime, currentTime, targets);
55+
final View view = new View(request.getName(), request.getDescription(), currentTime, currentTime, new TreeSet<>(targets));
5556

5657
createOrUpdateView(Operation.CreateView, view, listener);
5758
}
@@ -64,7 +65,13 @@ public void updateView(final CreateViewAction.Request request, final ActionListe
6465
.stream()
6566
.map(target -> new View.Target(target.getIndexPattern()))
6667
.collect(Collectors.toList());
67-
final View updatedView = new View(request.getName(), request.getDescription(), originalView.getCreatedAt(), currentTime, targets);
68+
final View updatedView = new View(
69+
request.getName(),
70+
request.getDescription(),
71+
originalView.getCreatedAt(),
72+
currentTime,
73+
new TreeSet<>(targets)
74+
);
6875

6976
createOrUpdateView(Operation.UpdateView, updatedView, listener);
7077
}

server/src/main/java/org/opensearch/cluster/metadata/View.java

+21-9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
import java.io.IOException;
2424
import java.util.List;
2525
import java.util.Objects;
26+
import java.util.Set;
27+
import java.util.SortedSet;
28+
import java.util.TreeSet;
29+
import java.util.stream.Collectors;
2630

2731
/** View of data in OpenSearch indices */
2832
@ExperimentalApi
@@ -32,18 +36,18 @@ public class View extends AbstractDiffable<View> implements ToXContentObject {
3236
private final String description;
3337
private final long createdAt;
3438
private final long modifiedAt;
35-
private final List<Target> targets;
39+
private final SortedSet<Target> targets;
3640

37-
public View(final String name, final String description, final Long createdAt, final Long modifiedAt, final List<Target> targets) {
41+
public View(final String name, final String description, final Long createdAt, final Long modifiedAt, final Set<Target> targets) {
3842
this.name = Objects.requireNonNull(name, "Name must be provided");
3943
this.description = description;
4044
this.createdAt = createdAt != null ? createdAt : -1;
4145
this.modifiedAt = modifiedAt != null ? modifiedAt : -1;
42-
this.targets = Objects.requireNonNull(targets, "Targets are required on a view");
46+
this.targets = new TreeSet<>(Objects.requireNonNull(targets, "Targets are required on a view"));
4347
}
4448

4549
public View(final StreamInput in) throws IOException {
46-
this(in.readString(), in.readOptionalString(), in.readZLong(), in.readZLong(), in.readList(Target::new));
50+
this(in.readString(), in.readOptionalString(), in.readZLong(), in.readZLong(), new TreeSet<>(in.readList(Target::new)));
4751
}
4852

4953
public String getName() {
@@ -62,8 +66,8 @@ public long getModifiedAt() {
6266
return modifiedAt;
6367
}
6468

65-
public List<Target> getTargets() {
66-
return targets;
69+
public SortedSet<Target> getTargets() {
70+
return new TreeSet<>(targets);
6771
}
6872

6973
public static Diff<View> readDiffFrom(final StreamInput in) throws IOException {
@@ -89,7 +93,7 @@ public int hashCode() {
8993

9094
/** The source of data used to project the view */
9195
@ExperimentalApi
92-
public static class Target implements Writeable, ToXContentObject {
96+
public static class Target implements Writeable, ToXContentObject, Comparable<Target> {
9397

9498
private final String indexPattern;
9599

@@ -144,6 +148,14 @@ public static Target fromXContent(final XContentParser parser) throws IOExceptio
144148
public void writeTo(final StreamOutput out) throws IOException {
145149
out.writeString(indexPattern);
146150
}
151+
152+
@Override
153+
public int compareTo(final Target o) {
154+
if (this == o) return 0;
155+
156+
final Target other = (Target) o;
157+
return this.indexPattern.compareTo(other.indexPattern);
158+
}
147159
}
148160

149161
public static final ParseField NAME_FIELD = new ParseField("name");
@@ -155,7 +167,7 @@ public void writeTo(final StreamOutput out) throws IOException {
155167
@SuppressWarnings("unchecked")
156168
public static final ConstructingObjectParser<View, Void> PARSER = new ConstructingObjectParser<>(
157169
"view",
158-
args -> new View((String) args[0], (String) args[1], (Long) args[2], (Long) args[3], (List<Target>) args[4])
170+
args -> new View((String) args[0], (String) args[1], (Long) args[2], (Long) args[3], new TreeSet<>((List<Target>) args[4]))
159171
);
160172

161173
static {
@@ -188,6 +200,6 @@ public void writeTo(final StreamOutput out) throws IOException {
188200
out.writeOptionalString(description);
189201
out.writeZLong(createdAt);
190202
out.writeZLong(modifiedAt);
191-
out.writeList(targets);
203+
out.writeList(targets.stream().collect(Collectors.toList()));
192204
}
193205
}

server/src/test/java/org/opensearch/action/admin/indices/view/ViewServiceTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import java.util.List;
2626
import java.util.Map;
27+
import java.util.Set;
2728
import java.util.concurrent.atomic.AtomicLong;
2829
import java.util.function.LongSupplier;
2930

@@ -50,7 +51,7 @@ public class ViewServiceTest {
5051
"description " + randomAlphaOfLength(20),
5152
-1L,
5253
-1L,
53-
List.of(typicalTarget)
54+
Set.of(typicalTarget)
5455
);
5556

5657
private ClusterService clusterService;

0 commit comments

Comments
 (0)