// Path: src/main/java/org/smartloli/kafka/eagle/core/sql/tool/JSqlDateUtils.java
// public class JSqlDateUtils {
// 
// 	public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
// 	public static final String DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS = "yyyy-MM-dd HH:mm:ss";
// 	public static final String DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS = "yyyy-MM-dd HH:mm:ss.SSS";
// 
// 	static final private Map<String, ThreadLocal<SimpleDateFormat>> threadLocalMap = new ConcurrentHashMap<String, ThreadLocal<SimpleDateFormat>>();
// 
// 	public static SimpleDateFormat getDateFormat(String datePattern) {
// 		ThreadLocal<SimpleDateFormat> formatThreadLocal = threadLocalMap.get(datePattern);
// 		if (formatThreadLocal == null) {
// 			threadLocalMap.put(datePattern, formatThreadLocal = new ThreadLocal<SimpleDateFormat>());
// 		}
// 		SimpleDateFormat format = formatThreadLocal.get();
// 		if (format == null) {
// 			format = new SimpleDateFormat(datePattern);
// 			format.setTimeZone(TimeZone.getTimeZone("GMT"));
// 			formatThreadLocal.set(format);
// 		}
// 		return format;
// 	}
// 
// 	public static String formatToDateStr(long millis) {
// 		return getDateFormat(DEFAULT_DATE_PATTERN).format(new Date(millis));
// 	}
// 
// 	public static String formatToTimeStr(long millis) {
// 		return getDateFormat(DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS).format(new Date(millis));
// 	}
// 
// 	public static String dateToString(Date date) {
// 		return dateToString(date, DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS);
// 	}
// 
// 	public static String dateToString(Date date, String pattern) {
// 		return getDateFormat(pattern).format(date);
// 	}
// 
// 	public static Date stringToDate(String str) {
// 		return stringToDate(str, DEFAULT_DATE_PATTERN);
// 	}
// 
// 	public static Date stringToDate(String str, String pattern) {
// 		Date date = null;
// 		try {
// 			date = Date.valueOf(str);
// 		} catch (Exception e) {
// 			throw new IllegalArgumentException("'" + str + "' is not a valid date of pattern '" + pattern + "'", e);
// 		}
// 		return date;
// 	}
// 
// 	public static long stringToMillis(String str) {
// 		if (isAllDigits(str)) {
// 			return Long.parseLong(str);
// 		} else if (str.length() == 10) {
// 			return stringToDate(str, DEFAULT_DATE_PATTERN).getTime();
// 		} else if (str.length() == 19) {
// 			return stringToDate(str, DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS).getTime();
// 		} else if (str.length() == 23) {
// 			return stringToDate(str, DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS).getTime();
// 		} else {
// 			throw new IllegalArgumentException("There is no valid date pattern for  : " + str);
// 		}
// 	}
// 
// 	private static boolean isAllDigits(String str) {
// 		for (int i = 0, n = str.length(); i < n; i++) {
// 			if (Character.isDigit(str.charAt(i)) == false)
// 				return false;
// 		}
// 		return true;
// 	}
// 
// }


import java.math.BigDecimal;
import java.util.List;
import org.apache.calcite.linq4j.Enumerator;
import org.smartloli.kafka.eagle.core.sql.tool.JSqlDateUtils;
		private int[] fields;

		public ArrayRowConverter(int[] fields) {
			this.fields = fields;
		}

		@Override
		Object[] convertRow(List<String> rows, List<String> columnTypes) {
			Object[] objects = new Object[fields.length];
			int i = 0;
			for (int field : this.fields) {
				objects[i++] = convertOptiqCellValue(rows.get(field), columnTypes.get(field));
			}
			return objects;
		}
	}

	public void close() {

	}

	public static Object convertOptiqCellValue(String strValue, String dataType) {
		if (strValue == null)
			return null;
	
		if ((strValue.equals("") || strValue.equals("\\N")) && !dataType.equals("string"))
			return null;
	
		// use data type enum instead of string comparison
		if ("date".equals(dataType)) {
// Path: src/main/java/org/smartloli/kafka/eagle/core/sql/tool/JSqlDateUtils.java
// public class JSqlDateUtils {
// 
// 	public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
// 	public static final String DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS = "yyyy-MM-dd HH:mm:ss";
// 	public static final String DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS = "yyyy-MM-dd HH:mm:ss.SSS";
// 
// 	static final private Map<String, ThreadLocal<SimpleDateFormat>> threadLocalMap = new ConcurrentHashMap<String, ThreadLocal<SimpleDateFormat>>();
// 
// 	public static SimpleDateFormat getDateFormat(String datePattern) {
// 		ThreadLocal<SimpleDateFormat> formatThreadLocal = threadLocalMap.get(datePattern);
// 		if (formatThreadLocal == null) {
// 			threadLocalMap.put(datePattern, formatThreadLocal = new ThreadLocal<SimpleDateFormat>());
// 		}
// 		SimpleDateFormat format = formatThreadLocal.get();
// 		if (format == null) {
// 			format = new SimpleDateFormat(datePattern);
// 			format.setTimeZone(TimeZone.getTimeZone("GMT"));
// 			formatThreadLocal.set(format);
// 		}
// 		return format;
// 	}
// 
// 	public static String formatToDateStr(long millis) {
// 		return getDateFormat(DEFAULT_DATE_PATTERN).format(new Date(millis));
// 	}
// 
// 	public static String formatToTimeStr(long millis) {
// 		return getDateFormat(DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS).format(new Date(millis));
// 	}
// 
// 	public static String dateToString(Date date) {
// 		return dateToString(date, DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS);
// 	}
// 
// 	public static String dateToString(Date date, String pattern) {
// 		return getDateFormat(pattern).format(date);
// 	}
// 
// 	public static Date stringToDate(String str) {
// 		return stringToDate(str, DEFAULT_DATE_PATTERN);
// 	}
// 
// 	public static Date stringToDate(String str, String pattern) {
// 		Date date = null;
// 		try {
// 			date = Date.valueOf(str);
// 		} catch (Exception e) {
// 			throw new IllegalArgumentException("'" + str + "' is not a valid date of pattern '" + pattern + "'", e);
// 		}
// 		return date;
// 	}
// 
// 	public static long stringToMillis(String str) {
// 		if (isAllDigits(str)) {
// 			return Long.parseLong(str);
// 		} else if (str.length() == 10) {
// 			return stringToDate(str, DEFAULT_DATE_PATTERN).getTime();
// 		} else if (str.length() == 19) {
// 			return stringToDate(str, DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS).getTime();
// 		} else if (str.length() == 23) {
// 			return stringToDate(str, DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS).getTime();
// 		} else {
// 			throw new IllegalArgumentException("There is no valid date pattern for  : " + str);
// 		}
// 	}
// 
// 	private static boolean isAllDigits(String str) {
// 		for (int i = 0, n = str.length(); i < n; i++) {
// 			if (Character.isDigit(str.charAt(i)) == false)
// 				return false;
// 		}
// 		return true;
// 	}
// 
// }


// Path: src/main/java/org/smartloli/kafka/eagle/core/sql/common/JSqlEnumerator.java
import java.math.BigDecimal;
import java.util.List;
import org.apache.calcite.linq4j.Enumerator;
import org.smartloli.kafka.eagle.core.sql.tool.JSqlDateUtils;

		private int[] fields;

		public ArrayRowConverter(int[] fields) {
			this.fields = fields;
		}

		@Override
		Object[] convertRow(List<String> rows, List<String> columnTypes) {
			Object[] objects = new Object[fields.length];
			int i = 0;
			for (int field : this.fields) {
				objects[i++] = convertOptiqCellValue(rows.get(field), columnTypes.get(field));
			}
			return objects;
		}
	}

	public void close() {

	}

	public static Object convertOptiqCellValue(String strValue, String dataType) {
		if (strValue == null)
			return null;
	
		if ((strValue.equals("") || strValue.equals("\\N")) && !dataType.equals("string"))
			return null;
	
		// use data type enum instead of string comparison
		if ("date".equals(dataType)) {
			return JSqlDateUtils.stringToDate(strValue);