go.mercari.io/datastore@v1.8.2/internal/shared/middleware_bridge.go (about) 1 package shared 2 3 import ( 4 "context" 5 6 "go.mercari.io/datastore" 7 ) 8 9 var _ datastore.Middleware = &MiddlewareBridge{} 10 11 type MiddlewareBridge struct { 12 ocb OriginalClientBridge 13 otb OriginalTransactionBridge 14 oib OriginalIteratorBridge 15 mws []datastore.Middleware 16 Info *datastore.MiddlewareInfo 17 } 18 19 type OriginalClientBridge interface { 20 AllocateIDs(ctx context.Context, keys []datastore.Key) ([]datastore.Key, error) 21 PutMulti(ctx context.Context, keys []datastore.Key, psList []datastore.PropertyList) ([]datastore.Key, error) 22 GetMulti(ctx context.Context, keys []datastore.Key, psList []datastore.PropertyList) error 23 DeleteMulti(ctx context.Context, keys []datastore.Key) error 24 Run(ctx context.Context, q datastore.Query, qDump *datastore.QueryDump) datastore.Iterator 25 GetAll(ctx context.Context, q datastore.Query, qDump *datastore.QueryDump, psList *[]datastore.PropertyList) ([]datastore.Key, error) 26 Count(ctx context.Context, q datastore.Query, qDump *datastore.QueryDump) (int, error) 27 } 28 29 type OriginalTransactionBridge interface { 30 PutMulti(keys []datastore.Key, psList []datastore.PropertyList) ([]datastore.PendingKey, error) 31 GetMulti(keys []datastore.Key, psList []datastore.PropertyList) error 32 DeleteMulti(keys []datastore.Key) error 33 } 34 35 type OriginalIteratorBridge interface { 36 Next(iter datastore.Iterator, ps *datastore.PropertyList) (datastore.Key, error) 37 } 38 39 func NewCacheBridge(info *datastore.MiddlewareInfo, ocb OriginalClientBridge, otb OriginalTransactionBridge, oib OriginalIteratorBridge, mws []datastore.Middleware) *MiddlewareBridge { 40 cb := &MiddlewareBridge{ 41 ocb: ocb, 42 otb: otb, 43 oib: oib, 44 mws: mws, 45 Info: info, 46 } 47 cb.Info.Next = cb 48 return cb 49 } 50 51 func (cb *MiddlewareBridge) AllocateIDs(info *datastore.MiddlewareInfo, keys []datastore.Key) ([]datastore.Key, error) { 52 if len(cb.mws) == 0 { 53 return cb.ocb.AllocateIDs(info.Context, keys) 54 } 55 56 current := cb.mws[0] 57 left := &MiddlewareBridge{ 58 ocb: cb.ocb, 59 otb: cb.otb, 60 oib: cb.oib, 61 mws: cb.mws[1:], 62 Info: cb.Info, 63 } 64 left.Info.Next = left 65 66 return current.AllocateIDs(left.Info, keys) 67 } 68 69 func (cb *MiddlewareBridge) PutMultiWithoutTx(info *datastore.MiddlewareInfo, keys []datastore.Key, psList []datastore.PropertyList) ([]datastore.Key, error) { 70 if len(cb.mws) == 0 { 71 return cb.ocb.PutMulti(info.Context, keys, psList) 72 } 73 74 current := cb.mws[0] 75 left := &MiddlewareBridge{ 76 ocb: cb.ocb, 77 otb: cb.otb, 78 oib: cb.oib, 79 mws: cb.mws[1:], 80 Info: cb.Info, 81 } 82 left.Info.Next = left 83 84 return current.PutMultiWithoutTx(left.Info, keys, psList) 85 } 86 87 func (cb *MiddlewareBridge) PutMultiWithTx(info *datastore.MiddlewareInfo, keys []datastore.Key, psList []datastore.PropertyList) ([]datastore.PendingKey, error) { 88 if len(cb.mws) == 0 { 89 return cb.otb.PutMulti(keys, psList) 90 } 91 92 current := cb.mws[0] 93 left := &MiddlewareBridge{ 94 ocb: cb.ocb, 95 otb: cb.otb, 96 oib: cb.oib, 97 mws: cb.mws[1:], 98 Info: cb.Info, 99 } 100 left.Info.Next = left 101 102 return current.PutMultiWithTx(left.Info, keys, psList) 103 } 104 105 func (cb *MiddlewareBridge) GetMultiWithoutTx(info *datastore.MiddlewareInfo, keys []datastore.Key, psList []datastore.PropertyList) error { 106 if len(cb.mws) == 0 { 107 return cb.ocb.GetMulti(info.Context, keys, psList) 108 } 109 110 current := cb.mws[0] 111 left := &MiddlewareBridge{ 112 ocb: cb.ocb, 113 otb: cb.otb, 114 oib: cb.oib, 115 mws: cb.mws[1:], 116 Info: cb.Info, 117 } 118 left.Info.Next = left 119 120 return current.GetMultiWithoutTx(left.Info, keys, psList) 121 } 122 123 func (cb *MiddlewareBridge) GetMultiWithTx(info *datastore.MiddlewareInfo, keys []datastore.Key, psList []datastore.PropertyList) error { 124 if len(cb.mws) == 0 { 125 return cb.otb.GetMulti(keys, psList) 126 } 127 128 current := cb.mws[0] 129 left := &MiddlewareBridge{ 130 ocb: cb.ocb, 131 otb: cb.otb, 132 oib: cb.oib, 133 mws: cb.mws[1:], 134 Info: cb.Info, 135 } 136 left.Info.Next = left 137 138 return current.GetMultiWithTx(left.Info, keys, psList) 139 } 140 141 func (cb *MiddlewareBridge) DeleteMultiWithoutTx(info *datastore.MiddlewareInfo, keys []datastore.Key) error { 142 if len(cb.mws) == 0 { 143 return cb.ocb.DeleteMulti(info.Context, keys) 144 } 145 146 current := cb.mws[0] 147 left := &MiddlewareBridge{ 148 ocb: cb.ocb, 149 otb: cb.otb, 150 oib: cb.oib, 151 mws: cb.mws[1:], 152 Info: cb.Info, 153 } 154 left.Info.Next = left 155 156 return current.DeleteMultiWithoutTx(left.Info, keys) 157 } 158 159 func (cb *MiddlewareBridge) DeleteMultiWithTx(info *datastore.MiddlewareInfo, keys []datastore.Key) error { 160 if len(cb.mws) == 0 { 161 return cb.otb.DeleteMulti(keys) 162 } 163 164 current := cb.mws[0] 165 left := &MiddlewareBridge{ 166 ocb: cb.ocb, 167 otb: cb.otb, 168 oib: cb.oib, 169 mws: cb.mws[1:], 170 Info: cb.Info, 171 } 172 left.Info.Next = left 173 174 return current.DeleteMultiWithTx(left.Info, keys) 175 } 176 177 func (cb *MiddlewareBridge) PostCommit(info *datastore.MiddlewareInfo, tx datastore.Transaction, commit datastore.Commit) error { 178 if len(cb.mws) == 0 { 179 return nil 180 } 181 182 current := cb.mws[0] 183 left := &MiddlewareBridge{ 184 ocb: cb.ocb, 185 otb: cb.otb, 186 oib: cb.oib, 187 mws: cb.mws[1:], 188 Info: cb.Info, 189 } 190 left.Info.Next = left 191 192 return current.PostCommit(left.Info, tx, commit) 193 } 194 195 func (cb *MiddlewareBridge) PostRollback(info *datastore.MiddlewareInfo, tx datastore.Transaction) error { 196 if len(cb.mws) == 0 { 197 return nil 198 } 199 200 current := cb.mws[0] 201 left := &MiddlewareBridge{ 202 ocb: cb.ocb, 203 otb: cb.otb, 204 oib: cb.oib, 205 mws: cb.mws[1:], 206 Info: cb.Info, 207 } 208 left.Info.Next = left 209 210 return current.PostRollback(left.Info, tx) 211 } 212 213 func (cb *MiddlewareBridge) Run(info *datastore.MiddlewareInfo, q datastore.Query, qDump *datastore.QueryDump) datastore.Iterator { 214 if len(cb.mws) == 0 { 215 return cb.ocb.Run(info.Context, q, qDump) 216 } 217 218 current := cb.mws[0] 219 left := &MiddlewareBridge{ 220 ocb: cb.ocb, 221 otb: cb.otb, 222 oib: cb.oib, 223 mws: cb.mws[1:], 224 Info: cb.Info, 225 } 226 left.Info.Next = left 227 228 return current.Run(left.Info, q, qDump) 229 } 230 231 func (cb *MiddlewareBridge) GetAll(info *datastore.MiddlewareInfo, q datastore.Query, qDump *datastore.QueryDump, psList *[]datastore.PropertyList) ([]datastore.Key, error) { 232 if len(cb.mws) == 0 { 233 return cb.ocb.GetAll(info.Context, q, qDump, psList) 234 } 235 236 current := cb.mws[0] 237 left := &MiddlewareBridge{ 238 ocb: cb.ocb, 239 otb: cb.otb, 240 oib: cb.oib, 241 mws: cb.mws[1:], 242 Info: cb.Info, 243 } 244 left.Info.Next = left 245 246 return current.GetAll(left.Info, q, qDump, psList) 247 } 248 249 func (cb *MiddlewareBridge) Next(info *datastore.MiddlewareInfo, q datastore.Query, qDump *datastore.QueryDump, iter datastore.Iterator, ps *datastore.PropertyList) (datastore.Key, error) { 250 if len(cb.mws) == 0 { 251 return cb.oib.Next(iter, ps) 252 } 253 254 current := cb.mws[0] 255 left := &MiddlewareBridge{ 256 ocb: cb.ocb, 257 otb: cb.otb, 258 oib: cb.oib, 259 mws: cb.mws[1:], 260 Info: cb.Info, 261 } 262 left.Info.Next = left 263 264 return current.Next(left.Info, q, qDump, iter, ps) 265 } 266 267 func (cb *MiddlewareBridge) Count(info *datastore.MiddlewareInfo, q datastore.Query, qDump *datastore.QueryDump) (int, error) { 268 if len(cb.mws) == 0 { 269 return cb.ocb.Count(info.Context, q, qDump) 270 } 271 272 current := cb.mws[0] 273 left := &MiddlewareBridge{ 274 ocb: cb.ocb, 275 otb: cb.otb, 276 oib: cb.oib, 277 mws: cb.mws[1:], 278 Info: cb.Info, 279 } 280 left.Info.Next = left 281 282 return current.Count(left.Info, q, qDump) 283 }