From fdb03737db887cf9e68051b3fb01bac03f0351fd Mon Sep 17 00:00:00 2001 From: ZhangJian He Date: Fri, 23 Aug 2024 15:31:38 +0800 Subject: [PATCH] refactor: add build method in condition Signed-off-by: ZhangJian He --- opengemini/query_builder.go | 25 +++---------------------- opengemini/query_builder_test.go | 4 ++-- opengemini/query_condition.go | 26 +++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/opengemini/query_builder.go b/opengemini/query_builder.go index f54db0d..f1c29d5 100644 --- a/opengemini/query_builder.go +++ b/opengemini/query_builder.go @@ -71,7 +71,7 @@ func (q *QueryBuilder) Build() *Query { if i > 0 { commandBuilder.WriteString(", ") } - commandBuilder.WriteString(q.buildExpression(expr)) + commandBuilder.WriteString(expr.build()) } } else { commandBuilder.WriteString("SELECT *") @@ -90,7 +90,7 @@ func (q *QueryBuilder) Build() *Query { // Build the WHERE part if q.where != nil { commandBuilder.WriteString(" WHERE ") - commandBuilder.WriteString(q.buildCondition(q.where)) + commandBuilder.WriteString(q.where.build()) } // Build the GROUP BY part @@ -100,7 +100,7 @@ func (q *QueryBuilder) Build() *Query { if i > 0 { commandBuilder.WriteString(", ") } - commandBuilder.WriteString(q.buildExpression(expr)) + commandBuilder.WriteString(expr.build()) } } @@ -130,22 +130,3 @@ func (q *QueryBuilder) Build() *Query { Command: commandBuilder.String(), } } - -func (q *QueryBuilder) buildExpression(expr Expression) string { - return expr.build() -} - -func (q *QueryBuilder) buildCondition(cond Condition) string { - switch c := cond.(type) { - case *ComparisonCondition: - return fmt.Sprintf(`"%s" %s '%v'`, c.Column, c.Operator, c.Value) - case *CompositeCondition: - var parts []string - for _, condition := range c.Conditions { - parts = append(parts, q.buildCondition(condition)) - } - return fmt.Sprintf("(%s)", strings.Join(parts, fmt.Sprintf(" %s ", c.LogicalOperator))) - default: - return "" - } -} diff --git a/opengemini/query_builder_test.go b/opengemini/query_builder_test.go index 000a1a9..6ed3eed 100644 --- a/opengemini/query_builder_test.go +++ b/opengemini/query_builder_test.go @@ -61,7 +61,7 @@ func TestQueryBuilderSelectWhereCondition(t *testing.T) { query := qb.From("h2o_feet").Where(condition).Build() - expectedQuery := `SELECT * FROM "h2o_feet" WHERE "water_level" > '8'` + expectedQuery := `SELECT * FROM "h2o_feet" WHERE "water_level" > 8` require.Equal(t, expectedQuery, query.Command) } @@ -79,7 +79,7 @@ func TestQueryBuilderSelectWithComplexWhereCondition(t *testing.T) { query := qb.Select(NewFieldExpression("water_level")).From("h2o_feet").Where(finalCondition).Build() - expectedQuery := `SELECT "water_level" FROM "h2o_feet" WHERE ("location" <> 'santa_monica' AND ("water_level" < '-0.57' OR "water_level" > '9.95'))` + expectedQuery := `SELECT "water_level" FROM "h2o_feet" WHERE ("location" <> 'santa_monica' AND ("water_level" < -0.57 OR "water_level" > 9.95))` require.Equal(t, expectedQuery, query.Command) } diff --git a/opengemini/query_condition.go b/opengemini/query_condition.go index 99e3742..2ba578c 100644 --- a/opengemini/query_condition.go +++ b/opengemini/query_condition.go @@ -1,6 +1,13 @@ package opengemini -type Condition interface{} +import ( + "fmt" + "strings" +) + +type Condition interface { + build() string +} type ComparisonCondition struct { Column string @@ -8,6 +15,15 @@ type ComparisonCondition struct { Value interface{} } +func (c *ComparisonCondition) build() string { + switch c.Value.(type) { + case string: + return fmt.Sprintf(`"%s" %s '%v'`, c.Column, c.Operator, c.Value) + default: + return fmt.Sprintf(`"%s" %s %v`, c.Column, c.Operator, c.Value) + } +} + func NewComparisonCondition(column string, operator ComparisonOperator, value interface{}) *ComparisonCondition { return &ComparisonCondition{ Column: column, @@ -21,6 +37,14 @@ type CompositeCondition struct { Conditions []Condition } +func (c *CompositeCondition) build() string { + var parts []string + for _, condition := range c.Conditions { + parts = append(parts, condition.build()) + } + return fmt.Sprintf("(%s)", strings.Join(parts, fmt.Sprintf(" %s ", c.LogicalOperator))) +} + func NewCompositeCondition(logicalOperator LogicalOperator, conditions ...Condition) *CompositeCondition { return &CompositeCondition{ LogicalOperator: logicalOperator,