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 }