SqliteExpressionContext.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using System;
  2. using System.Linq;
  3. namespace SqlSugar
  4. {
  5. public class SqliteExpressionContext : ExpressionContext, ILambdaExpressions
  6. {
  7. public override ExpressionContextCase Case { get; set; } = new ExpressionContextCase() {
  8. IsDateString= true,
  9. };
  10. public SqlSugarProvider Context { get; set; }
  11. public SqliteExpressionContext()
  12. {
  13. base.DbMehtods = new SqliteMethod();
  14. }
  15. public override string SqlTranslationLeft { get { return "`"; } }
  16. public override string SqlTranslationRight { get { return "`"; } }
  17. }
  18. public class SqliteMethod : DefaultDbMethod, IDbMethods
  19. {
  20. public override string WeekOfYear(MethodCallExpressionModel mode)
  21. {
  22. var parameterNameA = mode.Args[0].MemberName;
  23. return $"STRFTIME('%W', {parameterNameA})+1 ";
  24. }
  25. public override string Equals(MethodCallExpressionModel model)
  26. {
  27. var result= base.Equals(model);
  28. if (model.Args.Count == 3&& result.Trim().Last()==')')
  29. {
  30. result = (" "+result.Trim().TrimEnd(')') + " COLLATE NOCASE ) ");
  31. }
  32. return result;
  33. }
  34. public override string GetStringJoinSelector(string result, string separator)
  35. {
  36. return $"group_concat({result},'{separator}') ";
  37. }
  38. public override string DateDiff(MethodCallExpressionModel model)
  39. {
  40. var parameter = (DateType)(Enum.Parse(typeof(DateType), model.Args[0].MemberValue.ObjToString()));
  41. var begin = model.Args[1].MemberName;
  42. var end = model.Args[2].MemberName;
  43. switch (parameter)
  44. {
  45. case DateType.Year:
  46. return $" ( strftime('%Y',{end}) - strftime('%Y',{begin}) )";
  47. case DateType.Month:
  48. return $" ( (strftime('%m',{end}) - strftime('%m',{begin}))+(strftime('%Y',{end}) - strftime('%Y',{begin}))*12 )";
  49. case DateType.Day:
  50. return $" (julianday( strftime('%Y-%m-%d',datetime({end})) )-julianday(strftime('%Y-%m-%d',datetime({begin})))) ";
  51. case DateType.Hour:
  52. return $" ((julianday( strftime('%Y-%m-%d %H:%M',datetime({end})) )- julianday(strftime('%Y-%m-%d %H:%M',datetime({begin}))))*24 )";
  53. case DateType.Minute:
  54. return $" ((julianday( strftime('%Y-%m-%d %H:%M',datetime({end})) )- julianday(strftime('%Y-%m-%d %H:%M',datetime({begin}))))*24*60 )";
  55. case DateType.Second:
  56. return $" ((julianday( strftime('%Y-%m-%d %H:%M:%S',datetime({end})) )- julianday(strftime('%Y-%m-%d %H:%M:%S',datetime({begin}))))*24*60*60 )";
  57. case DateType.Millisecond:
  58. break;
  59. default:
  60. break;
  61. }
  62. throw new Exception(parameter + " datediff no support");
  63. }
  64. public override string Length(MethodCallExpressionModel model)
  65. {
  66. var parameter = model.Args[0];
  67. return string.Format("LENGTH({0})", parameter.MemberName);
  68. }
  69. public override string Substring(MethodCallExpressionModel model)
  70. {
  71. var parameter = model.Args[0];
  72. var parameter2 = model.Args[1];
  73. var parameter3 = model.Args[2];
  74. return string.Format("SUBSTR({0},1 + {1},{2})", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  75. }
  76. public override string Contains(MethodCallExpressionModel model)
  77. {
  78. var parameter = model.Args[0];
  79. var parameter2 = model.Args[1];
  80. return string.Format(" ({0} like '%'||{1}||'%') ", parameter.MemberName, parameter2.MemberName);
  81. }
  82. public override string StartsWith(MethodCallExpressionModel model)
  83. {
  84. var parameter = model.Args[0];
  85. var parameter2 = model.Args[1];
  86. return string.Format(" ({0} like {1}||'%') ", parameter.MemberName, parameter2.MemberName);
  87. }
  88. public override string EndsWith(MethodCallExpressionModel model)
  89. {
  90. var parameter = model.Args[0];
  91. var parameter2 = model.Args[1];
  92. return string.Format(" ({0} like '%'||{1}) ", parameter.MemberName, parameter2.MemberName);
  93. }
  94. public override string ToInt32(MethodCallExpressionModel model)
  95. {
  96. var parameter = model.Args[0];
  97. return string.Format(" CAST({0} AS INTEGER)", parameter.MemberName);
  98. }
  99. public override string ToInt64(MethodCallExpressionModel model)
  100. {
  101. var parameter = model.Args[0];
  102. return string.Format(" CAST({0} AS INTEGER)", parameter.MemberName);
  103. }
  104. public override string ToString(MethodCallExpressionModel model)
  105. {
  106. var parameter = model.Args[0];
  107. return string.Format(" CAST({0} AS TEXT)", parameter.MemberName);
  108. }
  109. public override string ToGuid(MethodCallExpressionModel model)
  110. {
  111. var parameter = model.Args[0];
  112. return string.Format(" CAST({0} AS TEXT)", parameter.MemberName);
  113. }
  114. public override string ToDouble(MethodCallExpressionModel model)
  115. {
  116. var parameter = model.Args[0];
  117. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  118. }
  119. public override string ToBool(MethodCallExpressionModel model)
  120. {
  121. var parameter = model.Args[0];
  122. return string.Format(" CAST({0} AS SIGNED)", parameter.MemberName);
  123. }
  124. public override string ToDecimal(MethodCallExpressionModel model)
  125. {
  126. var parameter = model.Args[0];
  127. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  128. }
  129. public override string ToDate(MethodCallExpressionModel model)
  130. {
  131. var parameter = model.Args[0];
  132. return string.Format(" DATETIME({0})", parameter.MemberName);
  133. }
  134. public override string ToDateShort(MethodCallExpressionModel model)
  135. {
  136. var parameter = model.Args[0];
  137. return string.Format(" strftime('%Y-%m-%d', {0})", parameter.MemberName);
  138. }
  139. public override string DateAddDay(MethodCallExpressionModel model)
  140. {
  141. var parameter = model.Args[0];
  142. var parameter2 = model.Args[1];
  143. if (parameter2.MemberValue.ObjToInt() < 0)
  144. {
  145. return string.Format(" DATE(DATETIME({0}), '-{1} days')", parameter.MemberName, Math.Abs(parameter2.MemberValue.ObjToInt()));
  146. }
  147. else
  148. {
  149. return string.Format(" DATE(DATETIME({0}), '+{1} days')", parameter.MemberName, parameter2.MemberValue);
  150. }
  151. }
  152. public override string DateAddByType(MethodCallExpressionModel model)
  153. {
  154. var parameter = model.Args[0].MemberName;
  155. var parameter2 = model.Args[1].MemberValue;
  156. var parameter3 = model.Args[2].MemberValue;
  157. if (parameter2.ObjToInt() < 0)
  158. {
  159. return string.Format(" DATETIME(DATETIME({0}), '-{1} {2}s')", parameter, Math.Abs(parameter2.ObjToInt()), parameter3);
  160. }
  161. else
  162. {
  163. return string.Format(" DATETIME(DATETIME({0}), '+{1} {2}s')", parameter, parameter2, parameter3);
  164. }
  165. }
  166. public override string DateValue(MethodCallExpressionModel model)
  167. {
  168. var parameter = model.Args[0];
  169. var typeName = model.Args[1].MemberValue.ToString();
  170. var parameter2 = typeName;
  171. var type = (DateType)Enum.Parse(typeof(DateType), parameter2, false);
  172. switch (type)
  173. {
  174. case DateType.Year:
  175. parameter2 = "%Y";
  176. break;
  177. case DateType.Month:
  178. parameter2 = "%m";
  179. break;
  180. case DateType.Day:
  181. parameter2 = "%d";
  182. return string.Format(" CAST(STRFTIME('{1}', DATETIME(DATETIME(strftime('%Y-%m-%d', {0})), 'LOCALTIME')) AS INTEGER)", parameter.MemberName, parameter2);
  183. case DateType.Hour:
  184. parameter2 = "%H";
  185. break;
  186. case DateType.Second:
  187. parameter2 = "%S";
  188. break;
  189. case DateType.Minute:
  190. parameter2 = "%M";
  191. break;
  192. case DateType.Weekday:
  193. return $" cast (strftime('%w', {parameter.MemberName}) as integer) ";
  194. case DateType.Millisecond:
  195. default:
  196. Check.ThrowNotSupportedException(typeName);
  197. break;
  198. }
  199. return string.Format(" CAST(STRFTIME('{1}', DATETIME({0}) ) AS INTEGER)", parameter.MemberName, parameter2);
  200. }
  201. public override string DateIsSameDay(MethodCallExpressionModel model)
  202. {
  203. var parameter = model.Args[0].MemberName;
  204. var parameter2 = model.Args[1].MemberName;
  205. int time = 1;
  206. return string.Format(" strftime('%Y-%m-%d', {0})= strftime('%Y-%m-%d', {1}) ", parameter, parameter2, time);
  207. }
  208. public override string DateIsSameByType(MethodCallExpressionModel model)
  209. {
  210. var parameter = model.Args[0].MemberName;
  211. var parameter2 = model.Args[1].MemberName;
  212. var parameter3 = model.Args[2].MemberValue;
  213. var type = (DateType)Enum.Parse(typeof(DateType), parameter3.ObjToString(), false);
  214. int time = 1;
  215. switch (type)
  216. {
  217. case DateType.Year:
  218. time = time * 1 / 365;
  219. break;
  220. case DateType.Month:
  221. time = time * 1 / 30;
  222. break;
  223. case DateType.Day:
  224. break;
  225. case DateType.Hour:
  226. time = time * 24;
  227. break;
  228. case DateType.Second:
  229. time = time * 24 * 60 * 60;
  230. break;
  231. case DateType.Minute:
  232. time = time * 24 * 60;
  233. break;
  234. case DateType.Millisecond:
  235. time = time * 24 * 60 * 60 * 1000;
  236. break;
  237. }
  238. return string.Format(" Cast((JulianDay({0}) - JulianDay({1})) *{2} As INTEGER)", parameter, parameter2, time);
  239. }
  240. public override string MergeString(params string[] strings)
  241. {
  242. return string.Join("||", strings).Replace("+","");
  243. }
  244. public override string IsNull(MethodCallExpressionModel model)
  245. {
  246. var parameter = model.Args[0];
  247. var parameter1 = model.Args[1];
  248. return string.Format("IFNULL({0},{1})", parameter.MemberName, parameter1.MemberName);
  249. }
  250. public override string GetDate()
  251. {
  252. return "DATETIME('now', 'localtime')";
  253. }
  254. public override string GetRandom()
  255. {
  256. return "RANDOM()";
  257. }
  258. public override string CharIndex(MethodCallExpressionModel model)
  259. {
  260. var parameterNameA = model.Args[0].MemberName;
  261. var parameterNameB = model.Args[1].MemberName;
  262. return $" INSTR(LOWER({parameterNameA}), LOWER({parameterNameB})) ";
  263. }
  264. public override string TrimEnd(MethodCallExpressionModel mode)
  265. {
  266. var parameterNameA = mode.Args[0].MemberName;
  267. var parameterNameB = mode.Args[1].MemberName;
  268. return $" CASE WHEN SUBSTR({parameterNameA}, -1) = {parameterNameB} THEN SUBSTR({parameterNameA}, 1, LENGTH({parameterNameA}) - 1) ELSE {parameterNameA} END ";
  269. }
  270. public override string TrimStart(MethodCallExpressionModel mode)
  271. {
  272. var parameterNameA = mode.Args[0].MemberName;
  273. var parameterNameB = mode.Args[1].MemberName;
  274. return $" CASE WHEN SUBSTR({parameterNameA}, 1, 1) ={parameterNameB} THEN SUBSTR({parameterNameA}, 2) ELSE {parameterNameA} END ";
  275. }
  276. public override string PadLeft(MethodCallExpressionModel mode)
  277. {
  278. var parameterNameA = mode.Args[0].MemberName;
  279. var parameterNameB = mode.Args[1].MemberName;
  280. var parameterNameC = mode.Args[2].MemberName;
  281. var value = new string[mode.Args[1].MemberValue.ObjToInt()].Select(it=> parameterNameC);
  282. return $"substr({string.Join("||", value)} || {parameterNameA}, {parameterNameB}*-1) ";
  283. }
  284. public override string Left(MethodCallExpressionModel mode)
  285. {
  286. var parameterNameA = mode.Args[0].MemberName;
  287. var parameterNameB = mode.Args[1].MemberName;
  288. return $" SUBSTR({parameterNameA}, 1, {parameterNameB}) ";
  289. }
  290. public override string Right(MethodCallExpressionModel mode)
  291. {
  292. var parameterNameA = mode.Args[0].MemberName;
  293. var parameterNameB = mode.Args[1].MemberName;
  294. return $" SUBSTR({parameterNameA}, -2, {parameterNameB}) ";
  295. }
  296. public override string NewUid(MethodCallExpressionModel mode)
  297. {
  298. return " substr(upper(hex(randomblob(4))), 1, 8) || '-' ||\r\n substr(upper(hex(randomblob(2))), 1, 4) || '-' ||\r\n '4' || substr(upper(hex(randomblob(2))), 2, 3) || '-' ||\r\n substr('89ab', 1 + (abs(random()) % 4), 1) || substr(upper(hex(randomblob(2))), 2, 3) || '-' ||\r\n substr(upper(hex(randomblob(6))), 1, 12) ";
  299. }
  300. }
  301. }