diff --git a/.editorconfig b/.editorconfig index 288a6a1..234377d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,8 +9,8 @@ indent_size = 2 [{Makefile,go.mod,go.sum,*.go,.gitmodules}] indent_style = tab -indent_size = 4 +indent_size = 2 [*.md] -indent_size = 4 +indent_size = 2 trim_trailing_whitespace = false diff --git a/jql.go b/jql.go index 4ff2755..ff2cc51 100644 --- a/jql.go +++ b/jql.go @@ -61,6 +61,12 @@ func (jql *Json2Sql) JsonRawCaseDefauleValue(raw json.RawMessage) (CaseDefauleVa return v, err == nil } +func (jql *Json2Sql) JsonRawLimitOffsetValue(raw json.RawMessage) (LimitOffsetValue, bool) { + var v LimitOffsetValue + err := json.Unmarshal(raw, &v) + return v, err == nil +} + func (jql *Json2Sql) isStringNumeric(s string) bool { for _, char := range s { if !unicode.IsDigit(char) { @@ -345,9 +351,17 @@ func (jql *Json2Sql) GenerateConditions(conditions ...Condition) string { func (jql *Json2Sql) GenerateLimit() string { var sql = "" - if jql.sqlJson.Limit != nil { - sql += fmt.Sprintf(" LIMIT %d", *jql.sqlJson.Limit) + v, b := jql.JsonRawLimitOffsetValue(*jql.sqlJson.Limit) + if b { + if v.IsStatic { + sql += fmt.Sprintf(" LIMIT %s", strconv.Itoa(v.Value)) + } else { + sql += fmt.Sprintf(" LIMIT %s%s%s", JQL_FLAG_OPEN, strconv.Itoa(v.Value), JQL_FLAG_CLOSE) + } + } else { + sql += fmt.Sprintf(" LIMIT %s", *jql.sqlJson.Limit) + } } return sql @@ -355,9 +369,17 @@ func (jql *Json2Sql) GenerateLimit() string { func (jql *Json2Sql) GenerateOffset() string { var sql = "" - if jql.sqlJson.Offset != nil { - sql += fmt.Sprintf(" OFFSET %d", *jql.sqlJson.Offset) + v, b := jql.JsonRawLimitOffsetValue(*jql.sqlJson.Offset) + if b { + if v.IsStatic { + sql += fmt.Sprintf(" OFFSET %s", strconv.Itoa(v.Value)) + } else { + sql += fmt.Sprintf(" OFFSET %s%s%s", JQL_FLAG_OPEN, strconv.Itoa(v.Value), JQL_FLAG_CLOSE) + } + } else { + sql += fmt.Sprintf(" OFFSET %s", *jql.sqlJson.Offset) + } } return sql diff --git a/jql_test.go b/jql_test.go index b9256ed..f14d4bf 100644 --- a/jql_test.go +++ b/jql_test.go @@ -665,6 +665,64 @@ func TestGenerateConditions_SubQuery(t *testing.T) { assert.Equal(t, strExpected, strings.TrimSpace(str)) } +func TestLimit_Static(t *testing.T) { + strTest := `{ + "limit": { + "isStatic": true, + "value": 10 + } + }` + strExpected := `LIMIT 10` + + jql, _ := NewJson2Sql([]byte(strTest)) + str := jql.GenerateLimit() + + assert.Equal(t, strExpected, strings.TrimSpace(str)) +} + +func TestLimit_ToParam(t *testing.T) { + strTest := `{ + "limit": { + "value": 10 + } + }` + strExpected := `LIMIT JQL_VALUE:10:END_JQL_VALUE` + + jql, _ := NewJson2Sql([]byte(strTest)) + str := jql.GenerateLimit() + + assert.Equal(t, strExpected, strings.TrimSpace(str)) +} + +func TestOffset_Static(t *testing.T) { + strTest := `{ + "offset": { + "isStatic": true, + "value": 10 + } + }` + strExpected := `OFFSET 10` + + jql, _ := NewJson2Sql([]byte(strTest)) + str := jql.GenerateOffset() + + assert.Equal(t, strExpected, strings.TrimSpace(str)) +} + +func TestOffset_ToParam(t *testing.T) { + strTest := `{ + "offset": { + "value": 10 + } + }` + strExpected := `OFFSET JQL_VALUE:10:END_JQL_VALUE` + + jql, _ := NewJson2Sql([]byte(strTest)) + str := jql.GenerateOffset() + + assert.Equal(t, strExpected, strings.TrimSpace(str)) +} + func TestBuildJsonToSql(t *testing.T) { jsonData := ` { diff --git a/sql_struct.go b/sql_struct.go index 7ae2cb8..d64c6cc 100644 --- a/sql_struct.go +++ b/sql_struct.go @@ -27,8 +27,8 @@ type SQLJson struct { Fields []string `json:"fields"` Sort *string `json:"sort"` } `json:"orderBy"` - Limit *int `json:"limit"` - Offset *int `json:"offset"` + Limit *json.RawMessage `json:"limit"` + Offset *json.RawMessage `json:"offset"` } type Join struct { @@ -68,5 +68,10 @@ type ValueAdjacent struct { IsStatic *bool `json:"isStatic"` } +type LimitOffsetValue struct { + IsStatic bool `json:"isStatic"` + Value int `json:"value"` +} + type ExpectationField ValueAdjacent type CaseDefauleValue ValueAdjacent