private static void findMinMax(Set<Array<String>> satisfyingHostRecords, TblColRef[] hostCols, String[] min, String[] max) { DataTypeOrder[] orders = new DataTypeOrder[hostCols.length]; for (int i = 0; i < hostCols.length; i++) { orders[i] = hostCols[i].getType().getOrder(); } for (Array<String> rec : satisfyingHostRecords) { String[] row = rec.data; for (int i = 0; i < row.length; i++) { min[i] = orders[i].min(min[i], row[i]); max[i] = orders[i].max(max[i], row[i]); } } }
case EQ: case IN: String filterMin = order.min((Set<String>) comp.getValues()); String filterMax = order.max((Set<String>) comp.getValues()); return order.compare(filterMin, maxVal) <= 0 && order.compare(minVal, filterMax) <= 0; case LT: return order.compare(minVal, filterVal) < 0; case LTE: return order.compare(minVal, filterVal) <= 0; case GT: return order.compare(maxVal, filterVal) > 0; case GTE: return order.compare(maxVal, filterVal) >= 0; case NEQ: case NOTIN:
public DataTypeOrder getOrder() { if (order == null) order = DataTypeOrder.getInstance(this); return order; }
public String max(Collection<String> values) { String max = null; for (String v : values) { max = max(max, v); } return max; }
public String min(Collection<String> values) { String min = null; for (String v : values) { min = min(min, v); } return min; }
public String max(String v1, String v2) { if (v1 == null) return v2; else if (v2 == null) return v1; else return compare(v1, v2) >= 0 ? v1 : v2; }
@Override public int compare(String s1, String s2) { Comparable o1 = toComparable(s1); Comparable o2 = toComparable(s2); // consider null if (o1 == o2) return 0; if (o1 == null) return -1; if (o2 == null) return 1; return o1.compareTo(o2); }
public String max(Collection<String> values) { String max = null; for (String v : values) { max = max(max, v); } return max; }
public String min(Collection<String> values) { String min = null; for (String v : values) { min = min(min, v); } return min; }
public String min(String v1, String v2) { if (v1 == null) return v2; else if (v2 == null) return v1; else return compare(v1, v2) <= 0 ? v1 : v2; }
@Override public int compare(String s1, String s2) { Comparable o1 = toComparable(s1); Comparable o2 = toComparable(s2); // consider null if (o1 == o2) return 0; if (o1 == null) return -1; if (o2 == null) return 1; return o1.compareTo(o2); }
case EQ: case IN: String filterMin = order.min((Set<String>) comp.getValues()); String filterMax = order.max((Set<String>) comp.getValues()); return order.compare(filterMin, maxVal) <= 0 && order.compare(minVal, filterMax) <= 0; case LT: return order.compare(minVal, filterVal) < 0; case LTE: return order.compare(minVal, filterVal) <= 0; case GT: return order.compare(maxVal, filterVal) > 0; case GTE: return order.compare(maxVal, filterVal) >= 0; case NEQ: case NOTIN:
public int compare(String value1, String value2) { return getOrder().compare(value1, value2); }
public DataTypeOrder getOrder() { if (order == null) order = DataTypeOrder.getInstance(this); return order; }
public String min(String v1, String v2) { if (v1 == null) return v2; else if (v2 == null) return v1; else return compare(v1, v2) <= 0 ? v1 : v2; }
public String max(String v1, String v2) { if (v1 == null) return v2; else if (v2 == null) return v1; else return compare(v1, v2) >= 0 ? v1 : v2; }
@Test public void testDataTypeOrder() { DataType intType = DataType.getType("integer"); DataTypeOrder dataTypeOrder = intType.getOrder(); Set<String> integers = Sets.newHashSet("100000", "2", "1000", "100", "77", "10", "9", "2000000", "-10000", "0"); Assert.assertEquals("2000000", dataTypeOrder.max(integers)); Assert.assertEquals("-10000", dataTypeOrder.min(integers)); DataType doubleType = DataType.getType("double"); dataTypeOrder = doubleType.getOrder(); Set<String> doubels = Sets.newHashSet("1.1", "-299.5", "100000", "1.000", "4.000000001", "0.00", "-1000000.231231", "8000000", "10", "10.00"); Assert.assertEquals("8000000", dataTypeOrder.max(doubels)); Assert.assertEquals("-1000000.231231", dataTypeOrder.min(doubels)); DataType datetimeType = DataType.getType("date"); dataTypeOrder = datetimeType.getOrder(); Set<String> datetimes = Sets.newHashSet("2010-01-02", "2888-08-09", "2018-05-26", "1527512082000", "2010-02-03 23:59:59", "2000-12-12 12:00:00", "1970-01-19 00:18:32", "1998-12-02", "2018-05-28 10:00:00.255", "1995-09-20 20:00:00.220"); Assert.assertEquals("2888-08-09", dataTypeOrder.max(datetimes)); Assert.assertEquals("1970-01-19 00:18:32", dataTypeOrder.min(datetimes)); DataType stringType = new DataType("varchar", 256, 10); dataTypeOrder = stringType.getOrder(); Set<String> strings = Sets.newHashSet(null, "", "中国", "China No.1", "神兽麒麟", "Rocket", "Apache Kylin", "google", "NULL", "empty"); Assert.assertEquals("神兽麒麟", dataTypeOrder.max(strings)); Assert.assertEquals("", dataTypeOrder.min(strings)); } }