1313
1414_LOGGER = logging .getLogger (__name__ )
1515
16+ class FlagSetsFilter (object ):
17+ """Config Flagsets Filter storage."""
18+
19+ def __init__ (self , flag_sets = []):
20+ self .flag_sets = set (flag_sets )
21+ self .should_filter = any (flag_sets )
22+
23+ def set_exist (self , flag_set ):
24+ if not self .should_filter :
25+ return True
26+ if not isinstance (flag_set , str ) or flag_set == '' :
27+ return False
28+
29+ return any (self .flag_sets .intersection (set ([flag_set ])))
30+
31+ def intersect (self , flag_sets ):
32+ if not self .should_filter :
33+ return True
34+ if not isinstance (flag_sets , set ) or len (flag_sets ) == 0 :
35+ return False
36+ return any (self .flag_sets .intersection (flag_sets ))
37+
38+
39+ class FlagSets (object ):
40+ """InMemory Flagsets storage."""
41+
42+ def __init__ (self , flag_sets = []):
43+ self ._lock = threading .RLock ()
44+ self .sets_feature_flag_map = {}
45+ for flag_set in flag_sets :
46+ self .sets_feature_flag_map [flag_set ] = set ()
47+
48+ def flag_set_exist (self , flag_set ):
49+ with self ._lock :
50+ return flag_set in self .sets_feature_flag_map .keys ()
51+
52+ def get_flag_set (self , flag_set ):
53+ with self ._lock :
54+ if self .flag_set_exist (flag_set ):
55+ return self .sets_feature_flag_map [flag_set ]
56+
57+ def add_flag_set (self , flag_set ):
58+ with self ._lock :
59+ if not self .flag_set_exist (flag_set ):
60+ self .sets_feature_flag_map [flag_set ] = set ()
61+
62+ def remove_flag_set (self , flag_set ):
63+ with self ._lock :
64+ if self .flag_set_exist (flag_set ):
65+ del self .sets_feature_flag_map [flag_set ]
66+
67+ def add_feature_flag_to_flag_set (self , flag_set , feature_flag ):
68+ with self ._lock :
69+ if self .flag_set_exist (flag_set ):
70+ self .sets_feature_flag_map [flag_set ].add (feature_flag )
71+
72+ def remove_feature_flag_to_flag_set (self , flag_set , feature_flag ):
73+ with self ._lock :
74+ if self .flag_set_exist (flag_set ):
75+ self .sets_feature_flag_map [flag_set ].remove (feature_flag )
76+
1677
1778class InMemorySplitStorage (SplitStorage ):
18- """InMemory implementation of a split storage."""
79+ """InMemory implementation of a feature flag storage."""
1980
2081 def __init__ (self , flag_sets = []):
2182 """Constructor."""
2283 self ._lock = threading .RLock ()
2384 self ._splits = {}
2485 self ._change_number = - 1
2586 self ._traffic_types = Counter ()
26- self ._sets_feature_flag_map = {}
27- self .config_flag_sets_used = len (flag_sets )
28- for flag_set in flag_sets :
29- self ._sets_feature_flag_map [flag_set ] = set ()
87+ self .flag_set = FlagSets (flag_sets )
88+ self .flag_set_filter = FlagSetsFilter (flag_sets )
3089
3190 def get (self , split_name ):
3291 """
@@ -82,11 +141,11 @@ def _put(self, split):
82141 self ._increase_traffic_type_count (split .traffic_type_name )
83142 if split .sets is not None :
84143 for flag_set in split .sets :
85- if flag_set not in self ._sets_feature_flag_map . keys ( ):
86- if self .config_flag_sets_used > 0 :
144+ if not self .flag_set . flag_set_exist ( flag_set ):
145+ if self .flag_set_filter . should_filter :
87146 continue
88- self ._sets_feature_flag_map [ flag_set ] = set ( )
89- self ._sets_feature_flag_map [ flag_set ]. add ( split .name )
147+ self .flag_set . add_flag_set ( flag_set )
148+ self .flag_set . add_feature_flag_to_flag_set ( flag_set , split .name )
90149
91150 def _remove (self , split_name ):
92151 """
@@ -118,9 +177,9 @@ def _remove_from_flag_sets(self, feature_flag):
118177 """
119178 if feature_flag .sets is not None :
120179 for flag_set in feature_flag .sets :
121- self ._sets_feature_flag_map [ flag_set ]. remove ( feature_flag .name )
122- if len (self ._sets_feature_flag_map [ flag_set ]) == 0 and self .config_flag_sets_used == 0 :
123- del self ._sets_feature_flag_map [ flag_set ]
180+ self .flag_set . remove_feature_flag_to_flag_set ( flag_set , feature_flag .name )
181+ if len (self .flag_set . get_flag_set ( flag_set )) == 0 and not self .flag_set_filter . should_filter :
182+ self .flag_set . remove_flag_set ( flag_set )
124183
125184 def get_feature_flags_by_sets (self , sets ):
126185 """
@@ -135,19 +194,13 @@ def get_feature_flags_by_sets(self, sets):
135194 with self ._lock :
136195 sets_to_fetch = []
137196 for flag_set in sets :
138- if flag_set not in self ._sets_feature_flag_map .keys ():
139- if self .config_flag_sets_used > 0 :
140- _LOGGER .warning ("Flag set %s is not part of the configured flag set list, ignoring the request." % (flag_set ))
141- continue
142- else :
143- self ._sets_feature_flag_map [flag_set ] = set ()
197+ if not self .flag_set .flag_set_exist (flag_set ):
198+ _LOGGER .warning ("Flag set %s is not part of the configured flag set list, ignoring it." % (flag_set ))
199+ continue
144200 sets_to_fetch .append (flag_set )
145201
146- if sets_to_fetch == []:
147- return []
148-
149202 to_return = set ()
150- [to_return .update (self ._sets_feature_flag_map [ flag_set ] ) for flag_set in sets_to_fetch ]
203+ [to_return .update (self .flag_set . get_flag_set ( flag_set ) ) for flag_set in sets_to_fetch ]
151204 return list (to_return )
152205
153206 def get_change_number (self ):
@@ -260,10 +313,7 @@ def is_flag_set_exist(self, flag_set):
260313 :return: True if the flag_set exist. False otherwise.
261314 :rtype: bool
262315 """
263- if flag_set in self ._sets_feature_flag_map .keys ():
264- return True
265- return False
266-
316+ return self .flag_set .flag_set_exist (flag_set )
267317
268318class InMemorySegmentStorage (SegmentStorage ):
269319 """In-memory implementation of a segment storage."""
0 commit comments