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  }