Procházet zdrojové kódy

fix(sql plugin): when using the datetime for index value, must convert it to Time type

Signed-off-by: Jianxiang Ran <rxan_embedded@163.com>
Jianxiang Ran před 3 roky
rodič
revize
0115b1bf21

+ 3 - 3
etc/sources/sql.yaml

@@ -31,10 +31,10 @@ mysql_config:
     indexFieldType: "DATETIME"
     indexFieldType: "DATETIME"
     dateTimeFormat: "YYYY-MM-dd HH:mm:ss"
     dateTimeFormat: "YYYY-MM-dd HH:mm:ss"
 
 
-sqltemplate_config:
+template_config:
   templateSqlQueryCfg:
   templateSqlQueryCfg:
-    TemplateSql: "select * from table where entry_data > {{.entry_data}}"
-    indexField: entry_data
+    TemplateSql: "select * from table where entry_date > '{{.entry_date}}'"
+    indexField: entry_date
     indexValue: "2022-04-13 06:22:32.233"
     indexValue: "2022-04-13 06:22:32.233"
     indexFieldType: "DATETIME"
     indexFieldType: "DATETIME"
     dateTimeFormat: "YYYY-MM-dd HH:mm:ssSSS"
     dateTimeFormat: "YYYY-MM-dd HH:mm:ssSSS"

+ 19 - 0
extensions/sqldatabase/sqlgen/sqlgen.go

@@ -80,6 +80,25 @@ func (cfg *sqlConfig) Init(props map[string]interface{}) error {
 	if cfg.TemplateSqlQueryCfg == nil && cfg.InternalSqlQueryCfg == nil {
 	if cfg.TemplateSqlQueryCfg == nil && cfg.InternalSqlQueryCfg == nil {
 		return fmt.Errorf("read properties %v fail with error: %v", props, err)
 		return fmt.Errorf("read properties %v fail with error: %v", props, err)
 	}
 	}
+
+	if cfg.TemplateSqlQueryCfg != nil && cfg.TemplateSqlQueryCfg.IndexFieldType == DATETIME_TYPE && cfg.TemplateSqlQueryCfg.DateTimeFormat != "" {
+		t, err := cast.InterfaceToTime(cfg.TemplateSqlQueryCfg.IndexValue, cfg.TemplateSqlQueryCfg.DateTimeFormat)
+		if err != nil {
+			err = fmt.Errorf("TemplateSqlQueryCfg InterfaceToTime datetime convert got error %v", err)
+			return err
+		}
+		cfg.TemplateSqlQueryCfg.IndexValue = t
+	}
+
+	if cfg.InternalSqlQueryCfg != nil && cfg.InternalSqlQueryCfg.IndexFieldType == DATETIME_TYPE && cfg.InternalSqlQueryCfg.DateTimeFormat != "" {
+		t, err := cast.InterfaceToTime(cfg.InternalSqlQueryCfg.IndexValue, cfg.InternalSqlQueryCfg.DateTimeFormat)
+		if err != nil {
+			err = fmt.Errorf("InternalSqlQueryCfg InterfaceToTime datetime convert got error %v", err)
+			return err
+		}
+		cfg.InternalSqlQueryCfg.IndexValue = t
+	}
+
 	return nil
 	return nil
 }
 }
 
 

+ 50 - 0
extensions/sqldatabase/sqlgen/templateSqlDialect_test.go

@@ -122,3 +122,53 @@ func TestTemplateQuery(t *testing.T) {
 		t.Errorf("SqlQueryStatement() = %v, want %v", nextSqlStr, want)
 		t.Errorf("SqlQueryStatement() = %v, want %v", nextSqlStr, want)
 	}
 	}
 }
 }
+
+func TestTemplateQuery_DateTime(t *testing.T) {
+	tempCfg := map[string]interface{}{
+		"templateSql":    "select * from table where responseTime > `{{.responseTime}}`",
+		"indexField":     "responseTime",
+		"indexValue":     "2008-10-25 14:56:59.123",
+		"indexFieldType": DATETIME_TYPE,
+		"dateTimeFormat": "YYYY-MM-dd HH:mm:ssSSS",
+	}
+
+	props := map[string]interface{}{
+		"templateSqlQueryCfg": tempCfg,
+	}
+
+	sqlcfg := &sqlConfig{}
+	_ = sqlcfg.Init(props)
+
+	s, _ := NewTemplateSqlQuery(sqlcfg.TemplateSqlQueryCfg)
+
+	//query
+	firstSqlStr, _ := s.SqlQueryStatement()
+
+	want := "select * from table where responseTime > `2008-10-25 14:56:59.123`"
+
+	if !reflect.DeepEqual(firstSqlStr, want) {
+		t.Errorf("SqlQueryStatement() = %v, want %v", firstSqlStr, want)
+	}
+
+	//query result
+	s.UpdateMaxIndexValue(map[string]interface{}{
+		"responseTime": getDatetimeFromstring("2008-10-29 14:56:59"),
+	})
+	s.UpdateMaxIndexValue(map[string]interface{}{
+		"responseTime": getDatetimeFromstring("2008-11-11 11:12:01"),
+	})
+	s.UpdateMaxIndexValue(map[string]interface{}{
+		"responseTime": getDatetimeFromstring("2008-11-09 15:45:21"),
+	})
+	s.UpdateMaxIndexValue(map[string]interface{}{
+		"responseTime": getDatetimeFromstring("2008-11-11 13:23:44"),
+	})
+
+	nextSqlStr, _ := s.SqlQueryStatement()
+
+	want = "select * from table where responseTime > `2008-11-11 13:23:44.000`"
+
+	if !reflect.DeepEqual(nextSqlStr, want) {
+		t.Errorf("SqlQueryStatement() = %v, want %v", nextSqlStr, want)
+	}
+}