ElasticSqlDateParseHelper.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package org.elasticsearch.dsl.parser.helper;
  2. import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
  3. import org.elasticsearch.dsl.exception.ElasticSql2DslException;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.regex.Pattern;
  8. public class ElasticSqlDateParseHelper {
  9. public static final String DEFAULT_ES_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
  10. public static final Pattern SQL_DATE_REGEX_PATTERN_01 = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
  11. public static final Pattern SQL_DATE_REGEX_PATTERN_02 = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}");
  12. public static final Pattern SQL_DATE_REGEX_PATTERN_03 = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
  13. private enum SqlDateRegex {
  14. DATE_REGEX_01 {
  15. @Override
  16. Pattern getPattern() {
  17. return SQL_DATE_REGEX_PATTERN_01;
  18. }
  19. @Override
  20. String getPatternString() {
  21. return "yyyy-MM-dd HH:mm:ss";
  22. }
  23. },
  24. DATE_REGEX_02 {
  25. @Override
  26. Pattern getPattern() {
  27. return SQL_DATE_REGEX_PATTERN_02;
  28. }
  29. @Override
  30. String getPatternString() {
  31. return "yyyy-MM-dd HH:mm";
  32. }
  33. },
  34. DATE_REGEX_03 {
  35. @Override
  36. Pattern getPattern() {
  37. return SQL_DATE_REGEX_PATTERN_03;
  38. }
  39. @Override
  40. String getPatternString() {
  41. return "yyyy-MM-dd";
  42. }
  43. };
  44. abstract Pattern getPattern();
  45. abstract String getPatternString();
  46. }
  47. public static boolean isDateMethod(SQLMethodInvokeExpr dateMethodExpr) {
  48. return ElasticSqlMethodInvokeHelper.DATE_METHOD.equalsIgnoreCase(dateMethodExpr.getMethodName());
  49. }
  50. public static boolean isDateArgStringValue(String date) {
  51. return SqlDateRegex.DATE_REGEX_01.getPattern().matcher(date).matches()
  52. || SqlDateRegex.DATE_REGEX_02.getPattern().matcher(date).matches()
  53. || SqlDateRegex.DATE_REGEX_03.getPattern().matcher(date).matches();
  54. }
  55. public static boolean isDateArgObjectValue(Object date) {
  56. if (date instanceof Date) {
  57. return true;
  58. }
  59. return false;
  60. }
  61. public static String formatDefaultEsDateStringValue(String date) {
  62. if (SqlDateRegex.DATE_REGEX_01.getPattern().matcher(date).matches()) {
  63. return formatDefaultEsDate(SqlDateRegex.DATE_REGEX_01.getPatternString(), date);
  64. }
  65. if (SqlDateRegex.DATE_REGEX_02.getPattern().matcher(date).matches()) {
  66. return formatDefaultEsDate(SqlDateRegex.DATE_REGEX_02.getPatternString(), date);
  67. }
  68. if (SqlDateRegex.DATE_REGEX_03.getPattern().matcher(date).matches()) {
  69. return formatDefaultEsDate(SqlDateRegex.DATE_REGEX_03.getPatternString(), date);
  70. }
  71. throw new ElasticSql2DslException("[syntax error] Sql cannot support such date type: " + date);
  72. }
  73. public static String formatDefaultEsDateObjectValue(Object date) {
  74. if (date instanceof Date) {
  75. SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_ES_DATE_FORMAT);
  76. return dateFormat.format(date);
  77. }
  78. throw new ElasticSql2DslException("[syntax error] Sql cannot support such date type: " + date.getClass());
  79. }
  80. public static String formatDefaultEsDate(String patternArg, String timeValArg) {
  81. try {
  82. SimpleDateFormat dateFormat = new SimpleDateFormat(patternArg);
  83. Date date = dateFormat.parse(timeValArg);
  84. dateFormat = new SimpleDateFormat(DEFAULT_ES_DATE_FORMAT);
  85. return dateFormat.format(date);
  86. } catch (ParseException pex) {
  87. throw new ElasticSql2DslException("[syntax error] Parse time arg error: " + timeValArg);
  88. }
  89. }
  90. }