rbdc_tdengine/encode.rs
1
2// use bigdecimal::BigDecimal;
3// use oracle::sql_type::ToSql;
4// use taos_query::prelude::ColumnView;
5use rbs::Value;
6// use taos::ColumnView;
7//
8// pub trait Encode {
9// fn encode(self, vec: & mut Vec<ColumnView>,) -> Result<(), Error>;
10// }
11// impl Encode for Value {
12// fn encode(self, vec: &mut Vec<ColumnView>) -> Result<(), Error> {
13// match self{
14// // Value::Ext(t, v) => match t {
15// // "Date" => {
16// // let s = v.as_str().unwrap_or_default();
17// // let d = DateTime::from_str(s).unwrap();
18// // // d.and_hms_milli_opt()
19// //
20// // let cv= ColumnView::from_millis_timestamp(vec![d.unix_timestamp_millis()]);
21// // vec.push(cv);
22// // },
23// // "DateTime" => {
24// // let s = v.as_str().unwrap_or_default();
25// // let d = DateTime::from_str(s).unwrap();
26// // // d.and_hms_milli_opt()
27// //
28// // let cv= ColumnView::from_millis_timestamp(vec![d.unix_timestamp_millis()]);
29// // vec.push(cv);
30// // }
31// // "Time" => {
32// // //TODO: need to fix this
33// // let s = v.as_str().unwrap_or_default();
34// // let d = DateTime::from_str(s).unwrap();
35// // // d.and_hms_milli_opt()
36// // let cv= ColumnView::from_millis_timestamp(vec![d.unix_timestamp_millis()]);
37// // vec.push(cv);
38// // }
39// // "Decimal" => {
40// // // let d = BigDecimal::from_str(&v.into_string().unwrap_or_default());
41// // let d:f64=v.into_string().unwrap().parse().unwrap();
42// // let cv=ColumnView::from_doubles(vec![d]);
43// // vec.push(cv);
44// // }
45// // "Json" => {
46// // return Err(Error::from("unimpl"));
47// // }
48// // "Timestamp" => {
49// // let t = v.as_u64().unwrap_or_default() as i64;
50// // let cv= ColumnView::from_millis_timestamp(vec![t]);
51// // vec.push(cv);
52// // }
53// // "Uuid" => {
54// // let d = v.into_string().unwrap();
55// // let cv=ColumnView::from_nchar(vec![d]);
56// // vec.push(cv);
57// // }
58// // _ => {
59// // return Err(Error::from("unimpl"));
60// // },
61// // }
62// Value::String(str)=>{
63// let cv=ColumnView::from_nchar(vec![str]);
64// vec.push(cv);
65// }
66// Value::I32(int)=>{
67// let cv=ColumnView::from_ints(vec![int]);
68// vec.push(cv);
69// }
70// Value::I64(int)=>{
71// let cv=ColumnView::from_big_ints(vec![int]);
72// vec.push(cv);
73// }
74// Value::F32(v)=>{
75// let cv=ColumnView::from_floats(vec![v]);
76// vec.push(cv);
77// }
78// Value::F64(v)=>{
79// let cv=ColumnView::from_doubles(vec![v]);
80// vec.push(cv);
81// }
82// Value::U32(v)=>{
83// let cv=ColumnView::from_unsigned_ints(vec![v]);
84// vec.push(cv);
85// }
86// Value::U64(v)=>{
87// let cv=ColumnView::from_unsigned_big_ints(vec![v]);
88// vec.push(cv);
89// }
90//
91// //TODO: more types!
92// _=>{
93// let cv=ColumnView::from_nchar(vec![self.to_string()]);
94// vec.push(cv);
95// }
96// }
97// Ok(())
98// }
99// }
100
101/// 将sql 语名中的 ? 替换 为Value 中的值
102pub fn sql_replacen(mut sql:String,params: Vec<Value>)->String {
103 // let placeholders=vec!["###","@","##"];
104 // let mut base64s=vec![];
105 // let mut index=0;
106 for v in params {
107 match v {
108 // Value::Null => {}
109 // Value::Bool(_) => {
110 // sql= sql.replacen("?", &*format!("{}", v), 1);
111 // }
112 // Value::I32(_) => {}
113 // Value::I64(_) => {}
114 // Value::U32(_) => {}
115 // Value::U64(_) => {}
116 // Value::F32(_) => {}
117 // Value::F64(_) => {}
118 Value::String(_) => {
119 // sql = sql.replacen("?", "#", 1);
120 // sql = sql.replace("\"", "'");
121 // println!("{}",v);
122 // let v_string=format!("{}",v);
123 // while let Some(find)= v_string.find(placeholders[index]) {
124 // index=index+1;
125 // break;
126 // };
127 // println!("{},{}",index,placeholders[index]);
128 // let base64= base64_url::encode(v_string.as_str());
129 // base64s.push(v_string);
130 // println!("base64={}",base64);
131 // let data=base64_url::decode(&base64);
132 // println!("{:?}",data);
133
134 // let v_rep=format!("{}",v).replace("\"",placeholders[index]);
135 // let v_rep=v_rep.trim_start_matches(placeholders[index]);
136 // let v_rep=v_rep.trim_end_matches(placeholders[index]);
137 //
138 // println!("{}",v_rep);
139
140 sql = sql.replacen("?", format!("{}",v).as_str(), 1);
141
142 // sql = sql.replace("\"", "'");
143 }
144 // Value::Binary(_) => {}
145 // Value::Array(_) => {}
146 // Value::Map(_) => {}
147 Value::Ext(name, ext_v) => {
148 if name.eq("Timestamp") {
149 let v=format!("{}",ext_v);
150 let v=v.parse::<u64>().unwrap_or_default();
151 sql = sql.replacen("?", &*format!("{}",v), 1);
152 }
153 if name.eq("DateTime"){
154 sql= sql.replacen("?", &*format!("{}", ext_v), 1);
155 }
156 if name.eq("Time"){
157 sql= sql.replacen("?", &*format!("{}", ext_v), 1);
158 }
159 if name.eq("Date"){
160 sql= sql.replacen("?", &*format!("{}", ext_v), 1);
161 }
162
163 }
164 // Value::Map(mut m) => {
165 // //Ok(IsNull::Yes)
166 // println!("{}",m);
167 // let t = m.index("type").as_str().unwrap_or_default();
168 // if t != "" {
169 // match t {
170 // "Date" => {
171 // let ext_v = m.rm("value");
172 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
173 // }
174 // "DateTime" => {
175 // let ext_v = m.rm("value");
176 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
177 // }
178 // "Time" => {
179 // let ext_v = m.rm("value");
180 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
181 // }
182 // "Timestamp" => {
183 // let ext_v = m.rm("value");
184 // let ext_v_string=format!("{}", ext_v).replace("TS","");
185 // sql = sql.replacen("?", &ext_v_string, 1);
186 // }
187 // "Decimal" => {
188 // let ext_v = m.rm("value");
189 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
190 // }
191 // "Json" => {
192 // let ext_v = m.rm("value");
193 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
194 // }
195 // "Uuid" => {
196 // let ext_v = m.rm("value");
197 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
198 // }
199 // _ => {
200 // let ext_v = m.rm("value");
201 // sql = sql.replacen("?", &*format!("{}", ext_v), 1);
202 // }
203 // }
204 // }
205 // }
206 _ => {
207 sql = sql.replacen("?", &*format!("{}", v), 1);
208 }
209 }
210
211 }
212 sql = sql.replace("\"", "'");
213
214 // sql=sql.replace(placeholders[index],"\"");
215
216
217 return sql;
218}
219
220#[cfg(test)]
221mod test{
222 use std::fmt::Debug;
223 use std::str::FromStr;
224 use fastdate::DateTime;
225 use rbdc::date::Date;
226 use rbdc::{datetime, time};
227 use rbdc::timestamp::Timestamp;
228 use rbs::Value;
229 use taos::ColumnView;
230 use crate::encode::sql_replacen;
231 // use crate::encode::Encode;
232
233 #[test]
234 fn test_value(){
235 let string_v=Value::String("测试".to_string());
236 let timestamp_v=Value::Ext("Timestamp",Box::new(Value::I64(1677859610000)));
237 println!("{},{}",timestamp_v,string_v);
238 let mut cvs:Vec<ColumnView>=vec![];
239 // string_v.encode(&mut cvs);
240 // timestamp_v.encode(&mut cvs);
241 // for cv in cvs {
242 // println!("{}",cv.to_vec());
243 // }
244 }
245 #[test]
246 fn string_replacen(){
247 let mut sql="select * from table where id=? and name=? and u32=? and bool=? timestamp<? and date>? and datetime<? and time=?".to_string();
248 let json_string=r#"[{"ts##":"2023-04-13 22:32:38.223747","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_PULS_OXIM_SAT_O2","vital_sign_value":"100","vital_sign_unit":"MDC_DIM_PERCENT","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.223848","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_PULS_OXIM_PULS_RATE","vital_sign_value":"94","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.223929","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_BLD_PERF_INDEX","vital_sign_value":"2.19","vital_sign_unit":"MDC_DIM_PERCENT","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224007","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_TTHOR_RESP_RATE","vital_sign_value":"20","vital_sign_unit":"MDC_DIM_RESP_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224084","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_ECG_V_P_C_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224169","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MNDRY_ECG_PAUSE_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224248","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MNDRY_ECG_VPB_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224324","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MNDRY_ECG_RHY_V_P_C_CPLT_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224378","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MNDRY_ECG_RHY_MISSB_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.224429","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MNDRY_ECG_BEAT_V_P_C_RonT_RATE","vital_sign_value":"0","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null},{"ts":"2023-04-13 22:32:38.22446","id":null,"device_no":"00","patientId":null,"vital_sign_name":"MDC_ECG_HEART_RATE","vital_sign_value":"95","vital_sign_unit":"MDC_DIM_BEAT_PER_MIN","acq_timestamp":1666277450000,"time_slot":null,"record_timestamp":null,"userId":null}]"#;
249 let name="字\\'符\\'串";
250 let vaules=vec![
251 Value::I64(10),
252 Value::String(name.to_string()),
253 Value::U32(32),
254 Value::Bool(false),
255 Value::Ext("Timestamp",Box::new(Value::I64(1677859610000))),
256 Value::Ext("Date", Box::new(Value::String("2023-03-20".to_string()))),
257 // Value::from(Date::from_str("2023-03-20").unwrap()),
258 Value::Ext("DateTime", Box::new(Value::String(fastdate::DateTime::now().to_string()))),
259 // Value::from(datetime::DateTime::from(fastdate::DateTime::now())),
260 Value::Ext("Time", Box::new(Value::String("15:04:05.999999999".to_string()))),
261 // Value::from(rbdc::types::time::Time::from_str("15:04:05.999999999").unwrap()),
262
263
264
265 ];
266 sql=sql_replacen(sql,vaules);
267 // sql=sql.replace("\"","'");
268 println!("{}",sql);
269 }
270}