@@ -21,9 +21,16 @@ func (c *Cache) CreateEntity(asset oam.Asset) (*types.Entity, error) {
2121 return nil , err
2222 }
2323
24- c .appendToDBQueue (func () {
25- _ , _ = c .db .CreateEntity (asset )
26- })
24+ if tag , found := c .checkCacheEntityTag (entity , "cache_create_entity" ); ! found {
25+ if last , err := time .Parse ("2006-01-02 15:04:05" , tag .Value ()); err == nil && time .Now ().Add (- 1 * c .freq ).After (last ) {
26+ _ = c .cache .DeleteEntityTag (tag .ID )
27+ _ = c .createCacheEntityTag (entity , "cache_create_entity" )
28+
29+ c .appendToDBQueue (func () {
30+ _ , _ = c .db .CreateEntity (asset )
31+ })
32+ }
33+ }
2734
2835 return entity , nil
2936}
@@ -62,18 +69,100 @@ func (c *Cache) FindEntityById(id string) (*types.Entity, error) {
6269
6370// FindEntityByContent implements the Repository interface.
6471func (c * Cache ) FindEntityByContent (asset oam.Asset , since time.Time ) ([]* types.Entity , error ) {
72+ c .Lock ()
73+ entities , err := c .cache .FindEntityByContent (asset , since )
74+ if err == nil && len (entities ) == 1 {
75+ if ! since .IsZero () && ! since .Before (c .start ) {
76+ c .Unlock ()
77+ return entities , err
78+ }
79+ if _ , found := c .checkCacheEntityTag (entities [0 ], "cache_find_entity_by_content" ); found {
80+ c .Unlock ()
81+ return entities , err
82+ }
83+ }
84+ c .Unlock ()
85+
86+ var dberr error
87+ var dbentities []* types.Entity
88+ done := make (chan struct {}, 1 )
89+ c .appendToDBQueue (func () {
90+ defer func () { done <- struct {}{} }()
91+
92+ dbentities , dberr = c .db .FindEntityByContent (asset , since )
93+ })
94+ <- done
95+ close (done )
96+
97+ if dberr != nil {
98+ return entities , err
99+ }
100+
65101 c .Lock ()
66102 defer c .Unlock ()
67103
68- return c .cache .FindEntityByContent (asset , since )
104+ var results []* types.Entity
105+ for _ , entity := range dbentities {
106+ if e , err := c .cache .CreateEntity (entity .Asset ); err == nil {
107+ results = append (results , e )
108+ if tags , err := c .cache .GetEntityTags (entity , c .start , "cache_find_entity_by_content" ); err == nil && len (tags ) > 0 {
109+ for _ , tag := range tags {
110+ _ = c .cache .DeleteEntityTag (tag .ID )
111+ }
112+ }
113+ _ = c .createCacheEntityTag (entity , "cache_find_entity_by_content" )
114+ }
115+ }
116+ return results , nil
69117}
70118
71119// FindEntitiesByType implements the Repository interface.
72120func (c * Cache ) FindEntitiesByType (atype oam.AssetType , since time.Time ) ([]* types.Entity , error ) {
121+ c .Lock ()
122+ entities , err := c .cache .FindEntitiesByType (atype , since )
123+ if err == nil && len (entities ) > 0 {
124+ if ! since .IsZero () && ! since .Before (c .start ) {
125+ c .Unlock ()
126+ return entities , err
127+ }
128+ if _ , found := c .checkCacheEntityTag (entities [0 ], "cache_find_entities_by_type" ); found {
129+ c .Unlock ()
130+ return entities , err
131+ }
132+ }
133+ c .Unlock ()
134+
135+ var dberr error
136+ var dbentities []* types.Entity
137+ done := make (chan struct {}, 1 )
138+ c .appendToDBQueue (func () {
139+ defer func () { done <- struct {}{} }()
140+
141+ dbentities , dberr = c .db .FindEntitiesByType (atype , since )
142+ })
143+ <- done
144+ close (done )
145+
146+ if dberr != nil {
147+ return entities , err
148+ }
149+
73150 c .Lock ()
74151 defer c .Unlock ()
75152
76- return c .cache .FindEntitiesByType (atype , since )
153+ var results []* types.Entity
154+ for _ , entity := range dbentities {
155+ if e , err := c .cache .CreateEntity (entity .Asset ); err == nil {
156+ results = append (results , e )
157+ if tags , err := c .cache .GetEntityTags (entity , c .start , "cache_find_entities_by_type" ); err == nil && len (tags ) > 0 {
158+ for _ , tag := range tags {
159+ _ = c .cache .DeleteEntityTag (tag .ID )
160+ }
161+ }
162+ _ = c .createCacheEntityTag (entity , "cache_find_entities_by_type" )
163+ }
164+ }
165+ return results , nil
77166}
78167
79168// DeleteEntity implements the Repository interface.
0 commit comments