11package strategy
22
33import (
4- "sync"
5-
6- "github.com/splitio/go-split-commons/v6/dtos"
74 "github.com/splitio/go-split-commons/v6/storage"
8- "github.com/splitio/go-toolkit/v5/datastructures/set"
95)
106
117// UniqueKeysTracker interface
128type UniqueKeysTracker interface {
139 Track (featureName string , key string ) bool
14- PopAll () dtos.Uniques
1510}
1611
1712// UniqueKeysTrackerImpl description
1813type UniqueKeysTrackerImpl struct {
19- filter storage.Filter
20- cache map [string ]* set.ThreadUnsafeSet
21- mutex * sync.RWMutex
14+ filter storage.Filter
15+ storage storage.UniqueKeysStorageProducer
2216}
2317
2418// NewUniqueKeysTracker create new implementation
25- func NewUniqueKeysTracker (f storage.Filter ) UniqueKeysTracker {
19+ func NewUniqueKeysTracker (f storage.Filter , storage storage. UniqueKeysStorageProducer ) UniqueKeysTracker {
2620 return & UniqueKeysTrackerImpl {
27- filter : f ,
28- cache : make (map [string ]* set.ThreadUnsafeSet ),
29- mutex : & sync.RWMutex {},
21+ filter : f ,
22+ storage : storage ,
3023 }
3124}
3225
@@ -37,49 +30,8 @@ func (t *UniqueKeysTrackerImpl) Track(featureName string, key string) bool {
3730 return false
3831 }
3932
40- t .mutex .Lock ()
41- defer t .mutex .Unlock ()
42-
4333 t .filter .Add (fKey )
44- _ , ok := t .cache [featureName ]
45- if ! ok {
46- t .cache [featureName ] = set .NewSet ()
47- }
48-
49- t .cache [featureName ].Add (key )
34+ t .storage .Push (featureName , key )
5035
5136 return true
5237}
53-
54- // PopAll returns all the elements stored in the cache and resets the cache
55- func (t * UniqueKeysTrackerImpl ) PopAll () dtos.Uniques {
56- t .mutex .Lock ()
57- defer t .mutex .Unlock ()
58- toReturn := t .cache
59- t .cache = make (map [string ]* set.ThreadUnsafeSet )
60-
61- return getUniqueKeysDto (toReturn )
62- }
63-
64- func getUniqueKeysDto (uniques map [string ]* set.ThreadUnsafeSet ) dtos.Uniques {
65- uniqueKeys := dtos.Uniques {
66- Keys : make ([]dtos.Key , 0 , len (uniques )),
67- }
68-
69- for name , keys := range uniques {
70- list := keys .List ()
71- keysDto := make ([]string , 0 , len (list ))
72-
73- for _ , value := range list {
74- keysDto = append (keysDto , value .(string ))
75- }
76- keyDto := dtos.Key {
77- Feature : name ,
78- Keys : keysDto ,
79- }
80-
81- uniqueKeys .Keys = append (uniqueKeys .Keys , keyDto )
82- }
83-
84- return uniqueKeys
85- }
0 commit comments