go.mercari.io/datastore@v1.8.2/boom/example_test.go (about)

     1  package boom_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"go.mercari.io/datastore"
     8  	"go.mercari.io/datastore/aedatastore"
     9  	"go.mercari.io/datastore/boom"
    10  	"go.mercari.io/datastore/clouddatastore"
    11  	"go.mercari.io/datastore/dsmiddleware/aememcache"
    12  	"go.mercari.io/datastore/dsmiddleware/localcache"
    13  	"go.mercari.io/datastore/internal/testutils"
    14  	"google.golang.org/appengine"
    15  	"google.golang.org/appengine/aetest"
    16  )
    17  
    18  const ProjectID = "datastore-wrapper"
    19  
    20  func appengineContext() (ctx context.Context, cancelFn func() error) {
    21  	inst, err := aetest.NewInstance(&aetest.Options{StronglyConsistentDatastore: true, SuppressDevAppServerLog: true})
    22  	if err != nil {
    23  		panic(err)
    24  	}
    25  	cancelFn = inst.Close
    26  	r, err := inst.NewRequest("GET", "/", nil)
    27  	if err != nil {
    28  		panic(err)
    29  	}
    30  	ctx = appengine.NewContext(r)
    31  
    32  	return
    33  }
    34  
    35  func ExampleBoom() {
    36  	ctx := context.Background()
    37  	// of-course, you can use aedatastore instead of clouddatastore!
    38  	client, err := clouddatastore.FromContext(
    39  		ctx,
    40  		datastore.WithProjectID(ProjectID),
    41  	)
    42  	if err != nil {
    43  		panic(err)
    44  	}
    45  	defer client.Close()
    46  	defer testutils.CleanUpAllEntities(ctx, client)
    47  
    48  	bm := boom.FromClient(ctx, client)
    49  
    50  	type Data struct {
    51  		ID   int64 `datastore:"-" boom:"id"`
    52  		Name string
    53  	}
    54  
    55  	key, err := bm.Put(&Data{Name: "mercari"})
    56  	if err != nil {
    57  		panic(err)
    58  	}
    59  	if key.ID() == 0 {
    60  		panic("unexpected state")
    61  	}
    62  
    63  	obj := &Data{ID: key.ID()}
    64  	err = bm.Get(obj)
    65  	if err != nil {
    66  		panic(err)
    67  	}
    68  
    69  	fmt.Println(obj.Name)
    70  
    71  	// Output: mercari
    72  }
    73  
    74  func ExampleBoom_kind() {
    75  	ctx := context.Background()
    76  	client, err := clouddatastore.FromContext(ctx)
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  	defer client.Close()
    81  	defer testutils.CleanUpAllEntities(ctx, client)
    82  
    83  	bm := boom.FromClient(ctx, client)
    84  
    85  	type Payment struct {
    86  		Kind   string `datastore:"-" boom:"kind,pay"`
    87  		ID     int64  `datastore:"-" boom:"id"`
    88  		Amount int
    89  	}
    90  
    91  	key, err := bm.Put(&Payment{
    92  		Amount: 100,
    93  	})
    94  	if err != nil {
    95  		panic(err)
    96  	}
    97  	fmt.Println(key.Kind())
    98  
    99  	key, err = bm.Put(&Payment{
   100  		Kind:   "支払い",
   101  		Amount: 100,
   102  	})
   103  	if err != nil {
   104  		panic(err)
   105  	}
   106  	fmt.Println(key.Kind())
   107  
   108  	// Output: pay
   109  	// 支払い
   110  }
   111  
   112  func ExampleBoom_parent() {
   113  	ctx := context.Background()
   114  	client, err := clouddatastore.FromContext(ctx)
   115  	if err != nil {
   116  		panic(err)
   117  	}
   118  	defer client.Close()
   119  	defer testutils.CleanUpAllEntities(ctx, client)
   120  
   121  	bm := boom.FromClient(ctx, client)
   122  
   123  	type Post struct {
   124  		ID      string `datastore:"-" boom:"id"`
   125  		Content string
   126  	}
   127  
   128  	type Comment struct {
   129  		ParentKey datastore.Key `datastore:"-" boom:"parent"`
   130  		ID        int64         `datastore:"-" boom:"id"`
   131  		Message   string
   132  	}
   133  
   134  	key, err := bm.Put(&Post{
   135  		ID:      "foobar",
   136  		Content: "post!",
   137  	})
   138  	if err != nil {
   139  		panic(err)
   140  	}
   141  
   142  	key, err = bm.Put(&Comment{
   143  		ParentKey: key,
   144  		ID:        1,
   145  		Message:   "comment!",
   146  	})
   147  	if err != nil {
   148  		panic(err)
   149  	}
   150  	fmt.Println(key.String())
   151  
   152  	// Output: /Post,foobar/Comment,1
   153  }
   154  
   155  func ExampleBoom_withCache() {
   156  	ctx, cancelFn := appengineContext()
   157  	go cancelFn()
   158  
   159  	client, err := aedatastore.FromContext(ctx)
   160  	if err != nil {
   161  		panic(err)
   162  	}
   163  	defer client.Close()
   164  
   165  	// add cache layer likes goon!
   166  	client.AppendMiddleware(localcache.New(
   167  		localcache.WithLogger(func(ctx context.Context, format string, args ...interface{}) {
   168  			fmt.Println(fmt.Sprintf(format, args...))
   169  		}),
   170  	))
   171  	client.AppendMiddleware(aememcache.New(
   172  		aememcache.WithLogger(func(ctx context.Context, format string, args ...interface{}) {
   173  			fmt.Println(fmt.Sprintf(format, args...))
   174  		}),
   175  	))
   176  
   177  	bm := boom.FromClient(ctx, client)
   178  
   179  	type Data struct {
   180  		ID  string `datastore:"-" boom:"id"`
   181  		Str string
   182  	}
   183  
   184  	_, err = bm.Put(&Data{
   185  		ID:  "test",
   186  		Str: "foobar",
   187  	})
   188  	if err != nil {
   189  		panic(err)
   190  	}
   191  
   192  	err = bm.Get(&Data{ID: "test"})
   193  	if err != nil {
   194  		panic(err)
   195  	}
   196  
   197  	// Output: dsmiddleware/aememcache.SetMulti: incoming len=1
   198  	// dsmiddleware/aememcache.SetMulti: len=1
   199  	// dsmiddleware/localcache.SetMulti: len=1
   200  	// dsmiddleware/localcache.SetMulti: idx=0 key=/Data,test len(ps)=1
   201  	// dsmiddleware/localcache.GetMulti: len=1
   202  	// dsmiddleware/localcache.GetMulti: idx=0 key=/Data,test
   203  	// dsmiddleware/localcache.GetMulti: idx=0, hit key=/Data,test len(ps)=1
   204  }