Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2e46fb6

Browse files
committed
Add new logic in custom storage to get split name and splits in consumer mode
1 parent c6ddd61 commit 2e46fb6

File tree

11 files changed

+75
-38
lines changed

11 files changed

+75
-38
lines changed

client/src/main/java/io/split/client/SplitClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ private List<String> filterSetsAreInConfig(Set<String> sets, MethodEnum methodEn
421421
FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(_config.getSetsFilter());
422422
List<String> setsToReturn = new ArrayList<>();
423423
for (String set : sets) {
424-
if (!flagSetsFilter.Intersect(set)) {
424+
if (!flagSetsFilter.intersect(set)) {
425425
_log.warn(String.format("%s: you passed %s which is not part of the configured FlagSetsFilter, " +
426426
"ignoring Flag Set.", methodEnum, set));
427427
continue;

client/src/main/java/io/split/client/SplitFactoryImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,8 @@ protected SplitFactoryImpl(String apiToken, SplitClientConfig config, CustomStor
279279
Metadata metadata = new Metadata(config.ipAddressEnabled(), SplitClientConfig.splitSdkVersion);
280280
_userStorageWrapper = new UserStorageWrapper(customStorageWrapper);
281281
UserCustomSegmentAdapterConsumer userCustomSegmentAdapterConsumer= new UserCustomSegmentAdapterConsumer(customStorageWrapper);
282-
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(customStorageWrapper);
282+
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(customStorageWrapper,
283+
config.getSetsFilter());
283284
// TODO migrate impressions sender to Task instead manager and not instantiate Producer here.
284285
UserCustomImpressionAdapterConsumer userCustomImpressionAdapterConsumer = new UserCustomImpressionAdapterConsumer();
285286
UserCustomImpressionAdapterProducer userCustomImpressionAdapterProducer = new UserCustomImpressionAdapterProducer(customStorageWrapper,

client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public interface FlagSetsFilter {
66

7-
boolean Intersect(Set<String> sets);
8-
boolean Intersect(String set);
7+
boolean intersect(Set<String> sets);
8+
boolean intersect(String set);
99
}

client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public FlagSetsFilterImpl(Set<String> flagSets) {
1212
_flagSets = flagSets;
1313
}
1414
@Override
15-
public boolean Intersect(Set<String> sets) {
15+
public boolean intersect(Set<String> sets) {
1616
if (!_shouldFilter) {
1717
return true;
1818
}
@@ -28,7 +28,7 @@ public boolean Intersect(Set<String> sets) {
2828
}
2929

3030
@Override
31-
public boolean Intersect(String set) {
31+
public boolean intersect(String set) {
3232
if (!_shouldFilter) {
3333
return true;
3434
}

client/src/main/java/io/split/client/utils/FeatureFlagProcessor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import io.split.client.dtos.Split;
44
import io.split.client.dtos.Status;
55
import io.split.client.interceptors.FlagSetsFilter;
6-
import io.split.client.interceptors.FlagSetsFilterImpl;
76
import io.split.engine.experiments.ParsedSplit;
87
import io.split.engine.experiments.SplitParser;
98
import org.slf4j.Logger;
@@ -27,7 +26,7 @@ public static FeatureFlagsToUpdate processFeatureFlagChanges(SplitParser splitPa
2726
toRemove.add(split.name);
2827
continue;
2928
}
30-
if (!flagSetsFilter.Intersect(split.sets)) {
29+
if (!flagSetsFilter.intersect(split.sets)) {
3130
toRemove.add(split.name);
3231
continue;
3332
}

client/src/main/java/io/split/storages/memory/InMemoryCacheImp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ private void addToFlagSets(ParsedSplit featureFlag) {
190190
return;
191191
}
192192
for (String set: sets) {
193-
if (!_flagSetsFilter.Intersect(set)) {
193+
if (!_flagSetsFilter.intersect(set)) {
194194
continue;
195195
}
196196
HashSet<String> features = _flagSets.get(set);

client/src/main/java/io/split/storages/pluggable/adapters/UserCustomSplitAdapterConsumer.java

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ public class UserCustomSplitAdapterConsumer implements SplitCacheConsumer {
3131

3232
private final SplitParser _splitParser;
3333
private final UserStorageWrapper _userStorageWrapper;
34+
private final HashSet<String> _flagSets;
3435

35-
public UserCustomSplitAdapterConsumer(CustomStorageWrapper customStorageWrapper) {
36+
public UserCustomSplitAdapterConsumer(CustomStorageWrapper customStorageWrapper, HashSet<String> flagSets) {
3637
_splitParser = new SplitParser();
3738
_userStorageWrapper = new UserStorageWrapper(checkNotNull(customStorageWrapper));
39+
_flagSets = flagSets;
3840
}
3941

4042
@Override
@@ -45,25 +47,35 @@ public long getChangeNumber() {
4547

4648
@Override
4749
public ParsedSplit get(String name) {
48-
String wrapperResponse = _userStorageWrapper.get(PrefixAdapter.buildSplitKey(name));
49-
if(wrapperResponse == null) {
50-
return null;
51-
}
52-
Split split = Json.fromJson(wrapperResponse, Split.class);
53-
if(split == null) {
54-
_log.warn("Could not parse Split.");
55-
return null;
50+
if (_flagSets.isEmpty() || getFlags().contains(name)){
51+
String wrapperResponse = _userStorageWrapper.get(PrefixAdapter.buildSplitKey(name));
52+
if(wrapperResponse == null) {
53+
return null;
54+
}
55+
Split split = Json.fromJson(wrapperResponse, Split.class);
56+
if(split == null) {
57+
_log.warn("Could not parse Split.");
58+
return null;
59+
}
60+
return _splitParser.parse(split);
5661
}
57-
return _splitParser.parse(split);
62+
return null;
5863
}
5964

6065
@Override
6166
public Collection<ParsedSplit> getAll() {
62-
Set<String> keys = _userStorageWrapper.getKeysByPrefix(PrefixAdapter.buildGetAllSplit());
63-
if(keys == null) {
64-
return new ArrayList<>();
67+
List<String> wrapperResponse;
68+
if (_flagSets.isEmpty()) {
69+
Set<String> keys = _userStorageWrapper.getKeysByPrefix(PrefixAdapter.buildGetAllSplit());
70+
if(keys == null) {
71+
return new ArrayList<>();
72+
}
73+
wrapperResponse = _userStorageWrapper.getMany(new ArrayList<>(keys));
74+
75+
} else {
76+
HashSet<String> flagNames = getFlags();
77+
wrapperResponse = _userStorageWrapper.getMany(PrefixAdapter.buildFetchManySplits(new ArrayList<>(flagNames)));
6578
}
66-
List<String> wrapperResponse = _userStorageWrapper.getMany(new ArrayList<>(keys));
6779
if(wrapperResponse == null) {
6880
return new ArrayList<>();
6981
}
@@ -88,10 +100,14 @@ public boolean trafficTypeExists(String trafficTypeName) {
88100

89101
@Override
90102
public List<String> splitNames() {
91-
Set<String> splitNamesWithPrefix = _userStorageWrapper.getKeysByPrefix(PrefixAdapter.buildGetAllSplit());
92-
splitNamesWithPrefix = splitNamesWithPrefix.stream().map(key -> key.replace(PrefixAdapter.buildSplitsPrefix(), "")).
93-
collect(Collectors.toSet());
94-
return new ArrayList<>(splitNamesWithPrefix);
103+
if(_flagSets.isEmpty()) {
104+
Set<String> splitNamesWithPrefix = _userStorageWrapper.getKeysByPrefix(PrefixAdapter.buildGetAllSplit());
105+
splitNamesWithPrefix = splitNamesWithPrefix.stream().map(key -> key.replace(PrefixAdapter.buildSplitsPrefix(), "")).
106+
collect(Collectors.toSet());
107+
return new ArrayList<>(splitNamesWithPrefix);
108+
}
109+
HashSet<String> flagNames = getFlags();
110+
return new ArrayList<>(flagNames);
95111
}
96112

97113
@Override
@@ -149,4 +165,13 @@ private List<ParsedSplit> stringsToParsedSplits(List<String> elements) {
149165
}
150166
return result;
151167
}
168+
169+
private HashSet<String> getFlags() {
170+
HashSet<String> flagNames = new HashSet<>();
171+
Map<String, HashSet<String>> nameByFlaySets = getNamesByFlagSets(new ArrayList<>(_flagSets));
172+
for (String set: nameByFlaySets.keySet()) {
173+
flagNames.addAll(nameByFlaySets.get(set));
174+
}
175+
return flagNames;
176+
}
152177
}

client/src/test/java/io/split/client/interceptors/FlagSetsFilterImplTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ public class FlagSetsFilterImplTest {
1111
@Test
1212
public void testIntersectSetsWithShouldFilter() {
1313
FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(new HashSet<>(Arrays.asList("a", "b")));
14-
Assert.assertTrue(flagSetsFilter.Intersect("a"));
15-
Assert.assertTrue(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("a", "c"))));
16-
Assert.assertFalse(flagSetsFilter.Intersect("c"));
17-
Assert.assertFalse(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("d", "c"))));
14+
Assert.assertTrue(flagSetsFilter.intersect("a"));
15+
Assert.assertTrue(flagSetsFilter.intersect(new HashSet<>(Arrays.asList("a", "c"))));
16+
Assert.assertFalse(flagSetsFilter.intersect("c"));
17+
Assert.assertFalse(flagSetsFilter.intersect(new HashSet<>(Arrays.asList("d", "c"))));
1818
}
1919

2020
@Test
2121
public void testIntersectSetsWithShouldNotFilter() {
2222
FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(new HashSet<>());
23-
Assert.assertTrue(flagSetsFilter.Intersect("a"));
24-
Assert.assertTrue(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("a", "c"))));
23+
Assert.assertTrue(flagSetsFilter.intersect("a"));
24+
Assert.assertTrue(flagSetsFilter.intersect(new HashSet<>(Arrays.asList("a", "c"))));
2525
}
2626
}

client/src/test/java/io/split/storages/pluggable/CustomStorageWrapperHasPipeline.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package io.split.storages.pluggable;
22

3+
import com.google.common.collect.Lists;
34
import com.google.common.collect.Maps;
5+
import io.split.client.dtos.Split;
6+
import io.split.client.utils.Json;
7+
import io.split.storages.pluggable.domain.PrefixAdapter;
48
import pluggable.CustomStorageWrapper;
59
import pluggable.HasPipelineSupport;
610
import pluggable.Pipeline;
711
import pluggable.Result;
812

913
import java.util.ArrayList;
1014
import java.util.Arrays;
15+
import java.util.HashMap;
1116
import java.util.HashSet;
1217
import java.util.List;
18+
import java.util.Map;
1319
import java.util.Set;
1420
import java.util.concurrent.Callable;
1521
import java.util.concurrent.ConcurrentMap;
@@ -18,6 +24,7 @@ public class CustomStorageWrapperHasPipeline implements CustomStorageWrapper, Ha
1824

1925
private static final String COUNTS = "SPLITIO.impressions.count";
2026
private static final String FLAG_SET = "SPLITIO.flagSet";
27+
private static final String SPLIT = "SPLITIO.split.";
2128
private final ConcurrentMap<String, Long> _impressionsCount = Maps.newConcurrentMap();
2229
private final ConcurrentMap<String, HashSet<String>> _flagSets = Maps.newConcurrentMap();
2330

@@ -182,8 +189,10 @@ private HashSet<String> getMembersToExecute(String key) {
182189
}
183190

184191
private String getStorage(String key) {
192+
if(key.startsWith(SPLIT))
193+
return SPLIT;
185194
if(key.startsWith(COUNTS))
186-
return COUNTS;
195+
return COUNTS;
187196
if(key.startsWith(FLAG_SET))
188197
return FLAG_SET;
189198
return "";

client/src/test/java/io/split/storages/pluggable/adapters/UserCustomSplitAdapterConsumerTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.lang.reflect.Modifier;
2424
import java.util.ArrayList;
2525
import java.util.Arrays;
26+
import java.util.Collection;
27+
import java.util.Collections;
2628
import java.util.HashSet;
2729
import java.util.List;
2830
import java.util.Map;
@@ -41,7 +43,7 @@ public class UserCustomSplitAdapterConsumerTest {
4143
public void setUp() throws NoSuchFieldException, IllegalAccessException {
4244
_customStorageWrapper = Mockito.mock(CustomStorageWrapper.class);
4345
_userStorageWrapper = Mockito.mock(UserStorageWrapper.class);
44-
_userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(_customStorageWrapper);
46+
_userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(_customStorageWrapper, new HashSet<>());
4547
Field userCustomSplitAdapterConsumer = UserCustomSplitAdapterConsumer.class.getDeclaredField("_userStorageWrapper");
4648
userCustomSplitAdapterConsumer.setAccessible(true);
4749
Field modifiersField = Field.class.getDeclaredField("modifiers");
@@ -194,15 +196,16 @@ public void testFetchManyNotFound() {
194196
@Test
195197
public void testGetNamesByFlagSets() {
196198
CustomStorageWrapper customStorageWrapper = new CustomStorageWrapperHasPipeline();
197-
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(customStorageWrapper);
199+
HashSet<String> sets = new HashSet<>(Arrays.asList("set1"));
200+
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(customStorageWrapper, sets);
198201
Map<String, HashSet<String>> flagSets = userCustomSplitAdapterConsumer.getNamesByFlagSets(new ArrayList<>(Arrays.asList("set1")));
199202
Assert.assertEquals(2, flagSets.get("set1").size());
200203
}
201204

202205
@Test
203206
public void testGetSegments() {
204207
//NoOp
205-
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(_customStorageWrapper);
208+
UserCustomSplitAdapterConsumer userCustomSplitAdapterConsumer = new UserCustomSplitAdapterConsumer(_customStorageWrapper, new HashSet<>());
206209
Assert.assertEquals(0, userCustomSplitAdapterConsumer.getSegments().size());
207210
}
208211

pluggable-storage/src/main/java/pluggable/Pipeline.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public interface Pipeline {
66
List<Result> exec() throws Exception;
7-
void hIncrement(String key, String field, long value);
7+
void hIncrement(String key, String field, long value) throws Exception;
88
void getMembers(String key) throws Exception;
99
}

0 commit comments

Comments
 (0)