[ https://issues.apache.org/jira/browse/DRILL-4081?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15006133#comment-15006133 ]
ASF GitHub Bot commented on DRILL-4081: --------------------------------------- Github user jacques-n commented on a diff in the pull request: https://github.com/apache/drill/pull/257#discussion_r44882947 --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/UnionFunctions.java --- @@ -32,16 +33,72 @@ import org.apache.drill.exec.expr.holders.UnionHolder; import org.apache.drill.exec.expr.holders.IntHolder; import org.apache.drill.exec.expr.holders.VarCharHolder; +import org.apache.drill.exec.resolver.TypeCastRules; import org.apache.drill.exec.vector.complex.impl.UnionReader; import org.apache.drill.exec.vector.complex.reader.FieldReader; import javax.inject.Inject; +import java.util.Set; /** * The class contains additional functions for union types in addition to those in GUnionFunctions */ public class UnionFunctions { + /** + * Returns zero if the inputs have equivalent types. Two numeric types are considered equivalent, as are a combination + * of date/timestamp. If not equivalent, returns a value determined by the numeric value of the MinorType enum + */ + @FunctionTemplate(names = {"compareType"}, + scope = FunctionTemplate.FunctionScope.SIMPLE, + nulls = NullHandling.INTERNAL) + public static class CompareType implements DrillSimpleFunc { + + @Param + FieldReader input1; + @Param + FieldReader input2; + @Output + IntHolder out; + + public void setup() {} + + public void eval() { + org.apache.drill.common.types.TypeProtos.MinorType type1; + if (input1.isSet()) { + type1 = input1.getType().getMinorType(); + } else { + type1 = org.apache.drill.common.types.TypeProtos.MinorType.NULL; + } + org.apache.drill.common.types.TypeProtos.MinorType type2; + if (input2.isSet()) { + type2 = input2.getType().getMinorType(); + } else { + type2 = org.apache.drill.common.types.TypeProtos.MinorType.NULL; + } + + out.value = org.apache.drill.exec.expr.fn.impl.UnionFunctions.compareTypes(type1, type2); + } + } + + public static int compareTypes(MinorType type1, MinorType type2) { + int typeValue1 = getTypeValue(type1); + int typeValue2 = getTypeValue(type2); + return typeValue1 - typeValue2; + } + + private static int getTypeValue(MinorType type) { + if (TypeCastRules.isNumericType(type)) { --- End diff -- would be good to add comments here. > Handle schema changes in ExternalSort > ------------------------------------- > > Key: DRILL-4081 > URL: https://issues.apache.org/jira/browse/DRILL-4081 > Project: Apache Drill > Issue Type: Improvement > Reporter: Steven Phillips > Assignee: Steven Phillips > > This improvement will make use of the Union vector to handle schema changes. > When a new schema appears, the schema will be "merged" with the previous > schema. The result will be a new schema that uses Union type to store the > columns where this is a type conflict. All of the batches (including the > batches that have already arrived) will be coerced into this new schema. > A new comparison function will be included to handle the comparison of Union > type. Comparison of union type will work as follows: > 1. All numeric types can be mutually compared, and will be compared using > Drill implicit cast rules. > 2. All other types will not be compared against other types, but only among > values of the same type. > 3. There will be an overall precedence of types with regards to ordering. > This precedence is not yet defined, but will be as part of the work on this > issue. -- This message was sent by Atlassian JIRA (v6.3.4#6332)