Skip to content

Commit 37d55b6

Browse files
committed
Created strategry class from factory instead of impression manager
1 parent 86a2e19 commit 37d55b6

4 files changed

Lines changed: 26 additions & 35 deletions

File tree

splitio/client/factory.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
from splitio.client import util
1313
from splitio.client.listener import ImpressionListenerWrapper
1414
from splitio.engine.impressions import Manager as ImpressionsManager
15+
from splitio.engine.strategies.strategy_debug_mode import StrategyDebugMode
16+
from splitio.engine.strategies.strategy_optimized_mode import StrategyOptimizedMode
17+
1518

1619
# Storage
1720
from splitio.storage.inmemmory import InMemorySplitStorage, InMemorySegmentStorage, \
@@ -314,10 +317,13 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
314317
'events': InMemoryEventStorage(cfg['eventsQueueSize']),
315318
}
316319

320+
imp_strategy = StrategyOptimizedMode(True) if cfg['ImpressionsMode'] == 'OPTIMIZED' else StrategyDebugMode(True)
321+
317322
imp_manager = ImpressionsManager(
318323
cfg['impressionsMode'],
319324
True,
320-
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata))
325+
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata),
326+
imp_strategy)
321327

322328
synchronizers = SplitSynchronizers(
323329
SplitSynchronizer(apis['splits'], storages['splits']),

splitio/engine/impressions.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66
from splitio.engine.strategies.strategy_optimized_mode import StrategyOptimizedMode
77
from splitio.engine.strategies import Observer, Counter
88

9-
import logging
10-
_LOGGER = logging.getLogger(__name__)
11-
12-
_IMPRESSION_OBSERVER_CACHE_SIZE = 500000
13-
149
class ImpressionsMode(Enum):
1510
"""Impressions tracking mode."""
1611

@@ -20,7 +15,7 @@ class ImpressionsMode(Enum):
2015
class Manager(object): # pylint:disable=too-few-public-methods
2116
"""Impression manager."""
2217

23-
def __init__(self, mode=ImpressionsMode.OPTIMIZED, standalone=True, listener=None):
18+
def __init__(self, mode=ImpressionsMode.OPTIMIZED, standalone=True, listener=None, strategy=None):
2419
"""
2520
Construct a manger to track and forward impressions to the queue.
2621
@@ -33,20 +28,11 @@ def __init__(self, mode=ImpressionsMode.OPTIMIZED, standalone=True, listener=Non
3328
:param listener: Optional impressions listener that will capture all seen impressions.
3429
:type listener: splitio.client.listener.ImpressionListenerWrapper
3530
"""
36-
self._observer = Observer(_IMPRESSION_OBSERVER_CACHE_SIZE) if standalone else None
31+
3732
self._counter = Counter() if standalone else None
38-
self._strategy = self.get_strategy(mode, standalone)
33+
self._strategy = strategy
3934
self._listener = listener
4035

41-
def get_strategy(self, mode, standalone):
42-
"""
43-
Return a strategy object based on mode value.
44-
45-
:returns: A strategy object
46-
:rtype: (BaseStrategy)
47-
"""
48-
return StrategyOptimizedMode(self._counter, self._observer, standalone) if mode == ImpressionsMode.OPTIMIZED else StrategyDebugMode(self._observer, standalone)
49-
5036
def process_impressions(self, impressions):
5137
"""
5238
Process impressions.
@@ -56,7 +42,7 @@ def process_impressions(self, impressions):
5642
:param impressions: List of impression objects with attributes
5743
:type impressions: list[tuple[splitio.models.impression.Impression, dict]]
5844
"""
59-
for_log, for_listener = self._strategy.process_impressions(impressions)
45+
for_log, for_listener = self._strategy.process_impressions(impressions, self._counter)
6046
self._send_impressions_to_listener(for_listener)
6147
return for_log
6248

splitio/engine/strategies/strategy_debug_mode.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
class StrategyDebugMode(BaseStrategy):
77
"""Debug mode strategy."""
88

9-
def __init__(self, observer=None, standalone=True):
9+
def __init__(self, standalone=True):
1010
"""
1111
Construct a strategy instance for debug mode.
1212
1313
"""
14-
self._standalone = standalone
15-
self._observer = observer
14+
self._observer = Observer(_IMPRESSION_OBSERVER_CACHE_SIZE) if standalone else None
1615

17-
def process_impressions(self, impressions):
16+
def process_impressions(self, impressions, counter=None):
1817
"""
1918
Process impressions.
2019
@@ -26,5 +25,5 @@ def process_impressions(self, impressions):
2625
:returns: Observed list of impressions
2726
:rtype: list[tuple[splitio.models.impression.Impression, dict]]
2827
"""
29-
for_listener = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions] if self._observer is not None else impressions
30-
return truncate_impressions_time(for_listener, None), for_listener
28+
imps = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions] if self._observer is not None else impressions
29+
return [i for i, _ in imps], imps
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from splitio.engine.strategies.base_strategy import BaseStrategy
2-
from splitio.engine.strategies import Observer, Counter, truncate_impressions_time
2+
from splitio.engine.strategies import Observer, Counter, truncate_time
33
from splitio import util
44

5+
_IMPRESSION_OBSERVER_CACHE_SIZE = 500000
6+
57
class StrategyOptimizedMode(BaseStrategy):
68
"""Optimized mode strategy."""
79

8-
def __init__(self, counter=None, observer=None, standalone=True):
10+
def __init__(self, standalone=True):
911
"""
1012
Construct a strategy instance for optimized mode.
1113
1214
"""
13-
self._standalone = standalone
14-
self._counter = counter
15-
self._observer = observer
15+
self._observer = Observer(_IMPRESSION_OBSERVER_CACHE_SIZE) if standalone else None
1616

17-
def process_impressions(self, impressions):
17+
def process_impressions(self, impressions, counter):
1818
"""
1919
Process impressions.
2020
@@ -26,7 +26,7 @@ def process_impressions(self, impressions):
2626
:returns: Observed list of impressions
2727
:rtype: list[tuple[splitio.models.impression.Impression, dict]]
2828
"""
29-
forListener = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions] if self._observer else impressions
30-
if self._counter is not None:
31-
self._counter.track([imp for imp, _ in forListener])
32-
return truncate_impressions_time(forListener, self._counter), forListener
29+
imps = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions] if self._observer else impressions
30+
counter.track([imp for imp, _ in imps])
31+
this_hour = truncate_time(util.utctime_ms())
32+
return [i for i, _ in imps if i.previous_time is None or i.previous_time < this_hour], imps

0 commit comments

Comments
 (0)