diff --git a/go.mod b/go.mod index f49fdda746..3944c9ae76 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,7 @@ require ( yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900 yunion.io/x/pkg v1.0.1-0.20230912084455-1393f31347db yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e - yunion.io/x/sqlchemy v1.1.2-0.20231011060911-10811127ad1e + yunion.io/x/sqlchemy v1.1.2-0.20231011085815-70c5a22668f2 yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6 ) diff --git a/go.sum b/go.sum index 73c8e51777..ef68e6992d 100644 --- a/go.sum +++ b/go.sum @@ -1193,7 +1193,7 @@ yunion.io/x/pkg v1.0.1-0.20230912084455-1393f31347db h1:yxiqu3C7wDnL3M8Nn54QmBp+ yunion.io/x/pkg v1.0.1-0.20230912084455-1393f31347db/go.mod h1:ksCJVQ+DwKrJ5QBEoU8pzrDFfDaZVAFH/iJ6yQCYxJk= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= -yunion.io/x/sqlchemy v1.1.2-0.20231011060911-10811127ad1e h1:iEaQ0UTB0CoBXeAvR6NjtZXiPTUAlVSlrsWyonNanEA= -yunion.io/x/sqlchemy v1.1.2-0.20231011060911-10811127ad1e/go.mod h1:uuPVZEyEq3sWd5vf9VjGSy6lZzof22X87OEHw9sddJQ= +yunion.io/x/sqlchemy v1.1.2-0.20231011085815-70c5a22668f2 h1:bRXgsqgsT37ifIK/NrkLazNHpBxOsjK5Tv5xxlD4Ap4= +yunion.io/x/sqlchemy v1.1.2-0.20231011085815-70c5a22668f2/go.mod h1:uuPVZEyEq3sWd5vf9VjGSy6lZzof22X87OEHw9sddJQ= yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6 h1:WuWXhY3DvhdRTzWCJ/kwt3Ss6KIq7+KqJwb+esvNGwU= yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng= diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index da07de94ad..f384844143 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -420,7 +420,7 @@ func (manager *SGuestManager) ListItemFilter( vipq := GroupguestManager.Query("guest_id") conditions := []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Contains(grpnets.Field("ip_addr"), ipAddr)) + conditions = append(conditions, sqlchemy.Regexp(grpnets.Field("ip_addr"), ipAddr)) } vipq = vipq.Join(grpnets, sqlchemy.Equals(grpnets.Field("group_id"), vipq.Field("group_id"))).Filter( sqlchemy.OR(conditions...), @@ -429,7 +429,7 @@ func (manager *SGuestManager) ListItemFilter( grpeips := ElasticipManager.Query().Equals("associate_type", api.EIP_ASSOCIATE_TYPE_INSTANCE_GROUP).SubQuery() conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Contains(grpeips.Field("ip_addr"), ipAddr)) + conditions = append(conditions, sqlchemy.Regexp(grpeips.Field("ip_addr"), ipAddr)) } vipeipq := GroupguestManager.Query("guest_id") vipeipq = vipeipq.Join(grpeips, sqlchemy.Equals(grpeips.Field("associate_id"), vipeipq.Field("group_id"))).Filter( @@ -439,14 +439,14 @@ func (manager *SGuestManager) ListItemFilter( gnQ := GuestnetworkManager.Query("guest_id") conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Contains(gnQ.Field("ip_addr"), ipAddr)) + conditions = append(conditions, sqlchemy.Regexp(gnQ.Field("ip_addr"), ipAddr)) } gn := gnQ.Filter(sqlchemy.OR(conditions...)) guestEipQ := ElasticipManager.Query("associate_id").Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER) conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Contains(guestEipQ.Field("ip_addr"), ipAddr)) + conditions = append(conditions, sqlchemy.Regexp(guestEipQ.Field("ip_addr"), ipAddr)) } guestEip := guestEipQ.Filter(sqlchemy.OR(conditions...)) @@ -454,7 +454,7 @@ func (manager *SGuestManager) ListItemFilter( conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { conditions = append(conditions, sqlchemy.AND( - sqlchemy.Contains(metadataQ.Field("value"), ipAddr), + sqlchemy.Regexp(metadataQ.Field("value"), ipAddr), sqlchemy.Equals(metadataQ.Field("key"), "sync_ips"), sqlchemy.Equals(metadataQ.Field("obj_type"), "server"), )) diff --git a/vendor/modules.txt b/vendor/modules.txt index dc30742aa0..17a677baf5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1586,7 +1586,7 @@ yunion.io/x/pkg/utils # yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e ## explicit; go 1.12 yunion.io/x/s3cli -# yunion.io/x/sqlchemy v1.1.2-0.20231011060911-10811127ad1e +# yunion.io/x/sqlchemy v1.1.2-0.20231011085815-70c5a22668f2 ## explicit; go 1.17 yunion.io/x/sqlchemy yunion.io/x/sqlchemy/backends diff --git a/vendor/yunion.io/x/sqlchemy/backends.go b/vendor/yunion.io/x/sqlchemy/backends.go index da6b412d9f..4a7811da33 100644 --- a/vendor/yunion.io/x/sqlchemy/backends.go +++ b/vendor/yunion.io/x/sqlchemy/backends.go @@ -56,7 +56,7 @@ type IBackend interface { // CaseInsensitiveLikeString() string // - CaseInsensitiveRegexpString() string + RegexpWhereClause(cond *SRegexpConition) string // UnionAllString() string // diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go index 7c987da67b..72e690fde7 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go @@ -15,6 +15,7 @@ package clickhouse import ( + "bytes" "fmt" "reflect" "strings" @@ -46,6 +47,16 @@ func (click *SClickhouseBackend) CaseInsensitiveLikeString() string { return "ILIKE" } +func (click *SClickhouseBackend) RegexpWhereClause(cond *sqlchemy.SRegexpConition) string { + var buf bytes.Buffer + buf.WriteString("match(") + buf.WriteString(cond.GetLeft().Reference()) + buf.WriteString(", ") + buf.WriteString(sqlchemy.VarConditionWhereClause(cond.GetRight())) + buf.WriteString(")") + return buf.String() +} + // CanUpdate returns wether the backend supports update func (click *SClickhouseBackend) CanUpdate() bool { return true diff --git a/vendor/yunion.io/x/sqlchemy/backends_base.go b/vendor/yunion.io/x/sqlchemy/backends_base.go index 04256379ce..31d731f103 100644 --- a/vendor/yunion.io/x/sqlchemy/backends_base.go +++ b/vendor/yunion.io/x/sqlchemy/backends_base.go @@ -60,8 +60,8 @@ func (bb *SBaseBackend) CaseInsensitiveLikeString() string { return "LIKE" } -func (bb *SBaseBackend) CaseInsensitiveRegexpString() string { - return "REGEXP" +func (bb *SBaseBackend) RegexpWhereClause(cond *SRegexpConition) string { + return tupleConditionWhereClause(&cond.STupleCondition, SQL_OP_REGEXP) } func (bb *SBaseBackend) UnionAllString() string { diff --git a/vendor/yunion.io/x/sqlchemy/conditions.go b/vendor/yunion.io/x/sqlchemy/conditions.go index 28b997c4eb..809b7ca882 100644 --- a/vendor/yunion.io/x/sqlchemy/conditions.go +++ b/vendor/yunion.io/x/sqlchemy/conditions.go @@ -336,7 +336,7 @@ func tupleConditionWhereClause(t *STupleCondition, op string) string { buf.WriteByte(' ') buf.WriteString(op) buf.WriteByte(' ') - buf.WriteString(varConditionWhereClause(t.right)) + buf.WriteString(VarConditionWhereClause(t.right)) return buf.String() } @@ -359,7 +359,7 @@ func questionMark(count int) string { } } -func varConditionWhereClause(v interface{}) string { +func VarConditionWhereClause(v interface{}) string { switch q := v.(type) { case IQueryField: return q.Reference() @@ -393,6 +393,14 @@ func NewTupleCondition(l IQueryField, r interface{}) STupleCondition { return STupleCondition{left: l, right: r} } +func (t *STupleCondition) GetLeft() IQueryField { + return t.left +} + +func (t *STupleCondition) GetRight() interface{} { + return t.right +} + // Variables implementation of STupleCondition for ICondition func (t *STupleCondition) Variables() []interface{} { return varConditionVariables(t.right) @@ -410,7 +418,7 @@ type SInCondition struct { } func inConditionWhereClause(t *STupleCondition, op string) string { - v := varConditionWhereClause(t.right) + v := VarConditionWhereClause(t.right) if len(v) != 0 { return tupleConditionWhereClause(t, op) } @@ -499,8 +507,7 @@ type SRegexpConition struct { // WhereClause implementation for SRegexpConition for ICondition func (t *SRegexpConition) WhereClause() string { - // op := t.left.database().backend.CaseInsensitiveRegexpString() - return tupleConditionWhereClause(&t.STupleCondition, SQL_OP_REGEXP) + return t.left.database().backend.RegexpWhereClause(t) } // Regexp SQL operator @@ -665,7 +672,7 @@ type SBetweenCondition struct { // WhereClause implementation of SBetweenCondition for ICondition func (t *SBetweenCondition) WhereClause() string { ret := tupleConditionWhereClause(&t.STupleCondition, SQL_OP_BETWEEN) - return fmt.Sprintf("%s AND %s", ret, varConditionWhereClause(t.right2)) + return fmt.Sprintf("%s AND %s", ret, VarConditionWhereClause(t.right2)) } // Between SQL operator diff --git a/vendor/yunion.io/x/sqlchemy/filter.go b/vendor/yunion.io/x/sqlchemy/filter.go index 43d1dddf03..b4d2763a42 100644 --- a/vendor/yunion.io/x/sqlchemy/filter.go +++ b/vendor/yunion.io/x/sqlchemy/filter.go @@ -49,6 +49,12 @@ func (tq *SQuery) Like(f string, v string) *SQuery { return tq.Filter(cond) } +// Regexp filters query with a regexp condition +func (tq *SQuery) Regexp(f string, v string) *SQuery { + cond := Regexp(tq.Field(f), v) + return tq.Filter(cond) +} + // Contains filters query with a contains condition func (tq *SQuery) Contains(f string, v string) *SQuery { cond := Contains(tq.Field(f), v)