sqlServerDialect.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2022 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package sqlgen
  15. import (
  16. "fmt"
  17. "github.com/lf-edge/ekuiper/pkg/cast"
  18. )
  19. type SqlServerQueryGenerator struct {
  20. *InternalSqlQueryCfg
  21. }
  22. func (q *SqlServerQueryGenerator) quoteIdentifier(identifier string) string {
  23. return "'" + identifier + "'"
  24. }
  25. func (q *SqlServerQueryGenerator) getSelect() string {
  26. if q.Limit != 0 {
  27. return fmt.Sprintf("select top %d * from %s ", q.Limit, q.Table)
  28. } else {
  29. return "select * from " + q.Table + " "
  30. }
  31. }
  32. func (q *SqlServerQueryGenerator) getCondition() (string, error) {
  33. var val string
  34. if q.IndexField != "" {
  35. if q.IndexFieldType == DATETIME_TYPE && q.DateTimeFormat != "" {
  36. t, err := cast.InterfaceToTime(q.IndexValue, q.DateTimeFormat)
  37. if err != nil {
  38. err = fmt.Errorf("SqlQueryStatement InterfaceToTime datetime convert got error %v", err)
  39. return "", err
  40. }
  41. val, err = cast.FormatTime(t, q.DateTimeFormat)
  42. if err != nil {
  43. err = fmt.Errorf("SqlQueryStatement FormatTime datetime convert got error %v", err)
  44. return "", err
  45. }
  46. } else {
  47. val = fmt.Sprintf("%v", q.IndexValue)
  48. }
  49. return "where " + q.IndexField + " > " + q.quoteIdentifier(val) + " ", nil
  50. }
  51. return "", nil
  52. }
  53. func (q *SqlServerQueryGenerator) getOrderby() string {
  54. if q.IndexField != "" {
  55. return "order by " + q.IndexField + " ASC"
  56. }
  57. return ""
  58. }
  59. func NewSqlServerQuery(cfg *InternalSqlQueryCfg) SqlQueryGenerator {
  60. in := &SqlServerQueryGenerator{
  61. InternalSqlQueryCfg: cfg,
  62. }
  63. return in
  64. }
  65. func (q *SqlServerQueryGenerator) SqlQueryStatement() (string, error) {
  66. con, err := q.getCondition()
  67. if err != nil {
  68. return "", err
  69. }
  70. return q.getSelect() + con + q.getOrderby(), nil
  71. }
  72. func (q *SqlServerQueryGenerator) UpdateMaxIndexValue(row map[string]interface{}) {
  73. // since internal sql have asc clause, so the last element is largest
  74. if q.IndexField != "" {
  75. v, found := row[q.IndexField]
  76. if !found {
  77. return
  78. }
  79. q.IndexValue = v
  80. }
  81. }