Просмотр исходного кода

支持清除旧数据的逻辑

Joey 2 недель назад
Родитель
Сommit
c2dbbdccd3
3 измененных файлов с 34 добавлено и 12 удалено
  1. 8 3
      modules/dataSaver.dos
  2. 5 5
      modules/rankingCalculator.dos
  3. 21 4
      modules/sqlUtilities.dos

+ 8 - 3
modules/dataSaver.dos

@@ -62,17 +62,22 @@ def save_hedge_fund_nav_to_local(tb_nav) {
 }
 
 /*
- *  将数据存到本地,之后传回MySQL并同步至正式表
+ *  将数据存到本地,之后传回MySQL并同步至正式表。同一个ID且不早于源表的数据会被清除
  *  
+ *  @param table <TABLE>: 数据表
+ *  @param source_table_name <STRING>: DolphinDB同步到MySQL的暂存表名
+ *  @param target_table_name <STRING>: 正式的MySQL数据表名
+ *  @param entity_id_col <STRING>: 暂存表中主键中的ID字段名
+ *  @param date_col <STRING>: 暂存表中主键中的日期字段名
  * 
  */
-def save_and_sync(table, source_table_name, target_table_name) {
+def save_and_sync(table, source_table_name, target_table_name, entity_id_col, date_col) {
 
     save_table(table, source_table_name, true);
 
     t_table_name = iif(target_table_name.isNothing(), source_table_name, target_table_name);
 
-    s_query = "CALL raw_db.sp_sync_table_from_dolphin('" + source_table_name + "_dolphin', '" + t_table_name + "');"
+    s_query = "CALL raw_db.sp_sync_table_from_dolphin('" + source_table_name + "_dolphin', '" + t_table_name + "', '" + entity_id_col + "','" + date_col + "');"
 
     conn = connect_mysql('raw_db');
 

+ 5 - 5
modules/rankingCalculator.dos

@@ -506,7 +506,7 @@ def save_ranking_tables(entity_type, ranking_by, ranking_tables) {
 			t.rename!(['entity_id', 'category_id'], [entity_id_col, category_id_col]);
 	}
 
-    save_and_sync(t, source_table, target_table);
+    save_and_sync(t, source_table, target_table, entity_id_col, 'end_date');
 
     t = ranking_tables[1];
 	if(ranking_by == 'bfi') {
@@ -518,7 +518,7 @@ def save_ranking_tables(entity_type, ranking_by, ranking_tables) {
 			t.rename!('category_id', category_id_col);
 	}
 
-    save_and_sync(t, source_table + '_num', target_table + '_num');
+    save_and_sync(t, source_table + '_num', target_table + '_num', entity_id_col, 'end_date');
 
 	// 基金有二级策略排名
     if(ranking_by == 'strategy' && entity_type IN ['HF', 'MF']) {
@@ -528,10 +528,10 @@ def save_ranking_tables(entity_type, ranking_by, ranking_tables) {
 	    category_id_col = 'substrategy';
 	
 	    t = ranking_tables[2];
-    	save_and_sync(t.rename!(['entity_id', 'category_id'], [entity_id_col, category_id_col]), source_table, target_table);
+    	save_and_sync(t.rename!(['entity_id', 'category_id'], [entity_id_col, category_id_col]), source_table, target_table, entity_id_col, 'end_date');
 
 		t = ranking_tables[3];
-	    save_and_sync(t.rename!('category_id', category_id_col), source_table + '_num', target_table + '_num');
+	    save_and_sync(t.rename!('category_id', category_id_col), source_table + '_num', target_table + '_num', entity_id_col, 'end_date');
     }
 	
 }
@@ -572,7 +572,7 @@ def save_relative_ranking_table(entity_type, ranking_table, ranking_by) {
     	
     }
 
-    save_and_sync(ranking_table, source_table, target_table);
+    save_and_sync(ranking_table, source_table, target_table, entity_id_col, 'end_date');
 	
 }
 

+ 21 - 4
modules/sqlUtilities.dos

@@ -438,13 +438,30 @@ def get_annulization_multiple(freq) {
 /*
  *   计算MySQL中常用的 year_week, 周一为一个星期的第一天,相当于 YEARWEEK(date, 1)
  *   
+ *   @param date<DATE|VECTOR>
  *   
- *   Example: get_year_week(2024.10.27);
- *            get_year_week(2024.11.01);
+ *   Example: get_year_week(2023.01.01);
+ *            get_year_week([2008.12.31, 2023.01.01]);
  *   
  */
 def get_year_week(date) {
 
-	// 当12月31日是周四、五、六时,该周为第52周,所以次年前几天有可能是上一年的第52,53周
-	return iif(date.weekOfYear() >= 52 && date.monthOfYear() == 1, date.year()-1, date.year())$STRING + (date.weekOfYear()$STRING).lpad(2, "0");
+	year = array(INT, 0, date.size());
+
+	for(d in date) {
+		
+		y = d.year();
+
+		// 当12月31日是周四、五、六时,该周为第52周,所以次年前几天有可能是上一年的第52,53周
+		if(d.weekOfYear() >= 52 && d.monthOfYear() == 1) {
+			y = d.year() - 1;
+		// 否则该周为次年的第1周
+		} else if(d.weekOfYear() == 1 && d.monthOfYear() == 12) {
+			y = d.year() + 1;
+		}
+
+		year = year.join(y);
+	}
+	
+	return year$STRING + (date.weekOfYear()$STRING).lpad(2, "0");
 }