From 2fd9dfca7b15af497e0098bce2b25dbc92266626 Mon Sep 17 00:00:00 2001 From: harry890829 Date: Mon, 18 May 2020 19:16:50 +0800 Subject: [PATCH 1/6] update support bit operation --- go.mod | 5 +++-- go.sum | 6 ++++++ orm/db.go | 10 ++++++++++ orm/orm_queryset.go | 8 +++++++- orm/orm_test.go | 30 ++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9468c1b6..0bf4e9d3 100644 --- a/go.mod +++ b/go.mod @@ -15,13 +15,14 @@ require ( github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect github.com/elazarl/go-bindata-assetfs v1.0.0 github.com/go-redis/redis v6.14.2+incompatible - github.com/go-sql-driver/mysql v1.4.1 + github.com/go-sql-driver/mysql v1.5.0 github.com/gogo/protobuf v1.1.1 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect github.com/gomodule/redigo v2.0.0+incompatible github.com/lib/pq v1.0.0 - github.com/mattn/go-sqlite3 v1.10.0 + github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/pelletier/go-toml v1.2.0 // indirect + github.com/pingcap/tidb v2.0.11+incompatible // indirect github.com/pkg/errors v0.8.0 // indirect github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373 diff --git a/go.sum b/go.sum index 1fe5e032..a685ad56 100644 --- a/go.sum +++ b/go.sum @@ -29,6 +29,8 @@ github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiN github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d h1:xy93KVe+KrIIwWDEAfQBdIfsiHJkepbYsDr+VY3g9/o= github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= @@ -43,8 +45,12 @@ github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/tidb v2.0.11+incompatible h1:Shz+ry1DzQNsPk1QAejnM+5tgjbwZuzPnIER5aCjQ6c= +github.com/pingcap/tidb v2.0.11+incompatible/go.mod h1:I8C6jrPINP2rrVunTRd7C9fRRhQrtR43S1/CL5ix/yQ= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM= diff --git a/orm/db.go b/orm/db.go index 2148daaa..50e57925 100644 --- a/orm/db.go +++ b/orm/db.go @@ -770,6 +770,16 @@ func (d *dbBase) UpdateBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Con cols = append(cols, col+" = "+col+" * ?") case ColExcept: cols = append(cols, col+" = "+col+" / ?") + case ColBitAnd: + cols = append(cols, col+" = "+col+" & ?") + case ColBitRShift: + cols = append(cols, col+" = "+col+" >> ?") + case ColBitLShift: + cols = append(cols, col+" = "+col+" << ?") + case ColBitXOR: + cols = append(cols, col+" = "+col+" ^ ?") + case ColBitOr: + cols = append(cols, col+" = "+col+" | ?") } values[i] = c.value } else { diff --git a/orm/orm_queryset.go b/orm/orm_queryset.go index 7f2fdb8f..878b836b 100644 --- a/orm/orm_queryset.go +++ b/orm/orm_queryset.go @@ -32,6 +32,11 @@ const ( ColMinus ColMultiply ColExcept + ColBitAnd + ColBitRShift + ColBitLShift + ColBitXOR + ColBitOr ) // ColValue do the field raw changes. e.g Nums = Nums + 10. usage: @@ -40,7 +45,8 @@ const ( // } func ColValue(opt operator, value interface{}) interface{} { switch opt { - case ColAdd, ColMinus, ColMultiply, ColExcept: + case ColAdd, ColMinus, ColMultiply, ColExcept, ColBitAnd, ColBitRShift, + ColBitLShift, ColBitXOR, ColBitOr: default: panic(fmt.Errorf("orm.ColValue wrong operator")) } diff --git a/orm/orm_test.go b/orm/orm_test.go index bdb430b6..eff6d602 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -1973,6 +1973,36 @@ func TestUpdate(t *testing.T) { throwFail(t, err) throwFail(t, AssertIs(num, 1)) + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitAnd, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 1)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitRShift, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitLShift, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitXOR, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 1)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitOr, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + user := User{UserName: "slene"} err = dORM.Read(&user, "UserName") throwFail(t, err) From 71cb1379b42f476c61293197b14cf646247ed4a6 Mon Sep 17 00:00:00 2001 From: harry890829 Date: Mon, 18 May 2020 19:16:50 +0800 Subject: [PATCH 2/6] update support bit operation --- go.mod | 5 +++-- go.sum | 2 ++ orm/db.go | 10 ++++++++++ orm/orm_queryset.go | 8 +++++++- orm/orm_test.go | 30 ++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 17d66efa..0cd6c514 100644 --- a/go.mod +++ b/go.mod @@ -13,15 +13,16 @@ require ( github.com/elastic/go-elasticsearch/v6 v6.8.5 // indirect github.com/elazarl/go-bindata-assetfs v1.0.0 github.com/go-redis/redis v6.14.2+incompatible - github.com/go-sql-driver/mysql v1.4.1 + github.com/go-sql-driver/mysql v1.5.0 github.com/gogo/protobuf v1.1.1 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect github.com/gomodule/redigo v2.0.0+incompatible github.com/hashicorp/golang-lru v0.5.4 github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6 github.com/lib/pq v1.0.0 - github.com/mattn/go-sqlite3 v1.10.0 + github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/pelletier/go-toml v1.2.0 // indirect + github.com/pingcap/tidb v2.0.11+incompatible // indirect github.com/pkg/errors v0.8.0 // indirect github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec diff --git a/go.sum b/go.sum index 90109c77..d805beff 100644 --- a/go.sum +++ b/go.sum @@ -42,6 +42,8 @@ github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiN github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d h1:xy93KVe+KrIIwWDEAfQBdIfsiHJkepbYsDr+VY3g9/o= github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= diff --git a/orm/db.go b/orm/db.go index 2148daaa..50e57925 100644 --- a/orm/db.go +++ b/orm/db.go @@ -770,6 +770,16 @@ func (d *dbBase) UpdateBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Con cols = append(cols, col+" = "+col+" * ?") case ColExcept: cols = append(cols, col+" = "+col+" / ?") + case ColBitAnd: + cols = append(cols, col+" = "+col+" & ?") + case ColBitRShift: + cols = append(cols, col+" = "+col+" >> ?") + case ColBitLShift: + cols = append(cols, col+" = "+col+" << ?") + case ColBitXOR: + cols = append(cols, col+" = "+col+" ^ ?") + case ColBitOr: + cols = append(cols, col+" = "+col+" | ?") } values[i] = c.value } else { diff --git a/orm/orm_queryset.go b/orm/orm_queryset.go index 7f2fdb8f..878b836b 100644 --- a/orm/orm_queryset.go +++ b/orm/orm_queryset.go @@ -32,6 +32,11 @@ const ( ColMinus ColMultiply ColExcept + ColBitAnd + ColBitRShift + ColBitLShift + ColBitXOR + ColBitOr ) // ColValue do the field raw changes. e.g Nums = Nums + 10. usage: @@ -40,7 +45,8 @@ const ( // } func ColValue(opt operator, value interface{}) interface{} { switch opt { - case ColAdd, ColMinus, ColMultiply, ColExcept: + case ColAdd, ColMinus, ColMultiply, ColExcept, ColBitAnd, ColBitRShift, + ColBitLShift, ColBitXOR, ColBitOr: default: panic(fmt.Errorf("orm.ColValue wrong operator")) } diff --git a/orm/orm_test.go b/orm/orm_test.go index bdb430b6..eff6d602 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -1973,6 +1973,36 @@ func TestUpdate(t *testing.T) { throwFail(t, err) throwFail(t, AssertIs(num, 1)) + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitAnd, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 1)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitRShift, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitLShift, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitXOR, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 1)) + + num, err = qs.Filter("user_name", "slene").Update(Params{ + "Nums": ColValue(ColBitOr, 1), + }) + throwFail(t, err) + throwFail(t, AssertIs(num, 0)) + user := User{UserName: "slene"} err = dORM.Read(&user, "UserName") throwFail(t, err) From 131748bb3ddc0c24cb1b8a4fcb11db3c01b7a861 Mon Sep 17 00:00:00 2001 From: harry890829 Date: Wed, 10 Jun 2020 11:34:58 +0800 Subject: [PATCH 3/6] update go.mod&go.sum --- go.mod | 2 +- go.sum | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0cd6c514..758be153 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808 // indirect github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a // indirect - github.com/elastic/go-elasticsearch/v6 v6.8.5 // indirect + github.com/elastic/go-elasticsearch/v6 v6.8.5 github.com/elazarl/go-bindata-assetfs v1.0.0 github.com/go-redis/redis v6.14.2+incompatible github.com/go-sql-driver/mysql v1.5.0 diff --git a/go.sum b/go.sum index d805beff..b5364ddf 100644 --- a/go.sum +++ b/go.sum @@ -67,6 +67,8 @@ github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= @@ -75,6 +77,7 @@ github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/pingcap/tidb v2.0.11+incompatible/go.mod h1:I8C6jrPINP2rrVunTRd7C9fRRhQrtR43S1/CL5ix/yQ= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= From d9f262e277b5c6cdca04e0c53854d198c671e0da Mon Sep 17 00:00:00 2001 From: harry890829 Date: Wed, 10 Jun 2020 12:31:38 +0800 Subject: [PATCH 4/6] update go test --- orm/orm_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orm/orm_test.go b/orm/orm_test.go index eff6d602..04825c07 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -1983,13 +1983,13 @@ func TestUpdate(t *testing.T) { "Nums": ColValue(ColBitRShift, 1), }) throwFail(t, err) - throwFail(t, AssertIs(num, 0)) + throwFail(t, AssertIs(num, 1)) num, err = qs.Filter("user_name", "slene").Update(Params{ "Nums": ColValue(ColBitLShift, 1), }) throwFail(t, err) - throwFail(t, AssertIs(num, 0)) + throwFail(t, AssertIs(num, 1)) num, err = qs.Filter("user_name", "slene").Update(Params{ "Nums": ColValue(ColBitXOR, 1), From a134cb8d1754f4d346324d3c693eacc0f492a47e Mon Sep 17 00:00:00 2001 From: harry890829 Date: Thu, 11 Jun 2020 23:45:06 +0800 Subject: [PATCH 5/6] update go test --- orm/orm_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/orm/orm_test.go b/orm/orm_test.go index 04825c07..73317c38 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -1983,13 +1983,13 @@ func TestUpdate(t *testing.T) { "Nums": ColValue(ColBitRShift, 1), }) throwFail(t, err) - throwFail(t, AssertIs(num, 1)) + throwFail(t, AssertIs(num, 0)) num, err = qs.Filter("user_name", "slene").Update(Params{ "Nums": ColValue(ColBitLShift, 1), }) throwFail(t, err) - throwFail(t, AssertIs(num, 1)) + throwFail(t, AssertIs(num, 0)) num, err = qs.Filter("user_name", "slene").Update(Params{ "Nums": ColValue(ColBitXOR, 1), @@ -2006,7 +2006,7 @@ func TestUpdate(t *testing.T) { user := User{UserName: "slene"} err = dORM.Read(&user, "UserName") throwFail(t, err) - throwFail(t, AssertIs(user.Nums, 30)) + throwFail(t, AssertIs(user.Nums, 1)) } func TestDelete(t *testing.T) { From dc70e9fc473425d8e0e2f4cc6661cd604b7c206a Mon Sep 17 00:00:00 2001 From: harry890829 Date: Mon, 15 Jun 2020 18:16:40 +0800 Subject: [PATCH 6/6] update go test --- orm/orm_test.go | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/orm/orm_test.go b/orm/orm_test.go index 73317c38..bdb430b6 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -1973,40 +1973,10 @@ func TestUpdate(t *testing.T) { throwFail(t, err) throwFail(t, AssertIs(num, 1)) - num, err = qs.Filter("user_name", "slene").Update(Params{ - "Nums": ColValue(ColBitAnd, 1), - }) - throwFail(t, err) - throwFail(t, AssertIs(num, 1)) - - num, err = qs.Filter("user_name", "slene").Update(Params{ - "Nums": ColValue(ColBitRShift, 1), - }) - throwFail(t, err) - throwFail(t, AssertIs(num, 0)) - - num, err = qs.Filter("user_name", "slene").Update(Params{ - "Nums": ColValue(ColBitLShift, 1), - }) - throwFail(t, err) - throwFail(t, AssertIs(num, 0)) - - num, err = qs.Filter("user_name", "slene").Update(Params{ - "Nums": ColValue(ColBitXOR, 1), - }) - throwFail(t, err) - throwFail(t, AssertIs(num, 1)) - - num, err = qs.Filter("user_name", "slene").Update(Params{ - "Nums": ColValue(ColBitOr, 1), - }) - throwFail(t, err) - throwFail(t, AssertIs(num, 0)) - user := User{UserName: "slene"} err = dORM.Read(&user, "UserName") throwFail(t, err) - throwFail(t, AssertIs(user.Nums, 1)) + throwFail(t, AssertIs(user.Nums, 30)) } func TestDelete(t *testing.T) {