drill-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From vvysotskyi <...@git.apache.org>
Subject [GitHub] drill pull request #909: DRILL-4264: Allow field names to include dots
Date Tue, 29 Aug 2017 10:37:03 GMT
Github user vvysotskyi commented on a diff in the pull request:

    https://github.com/apache/drill/pull/909#discussion_r135753493
  
    --- Diff: contrib/format-maprdb/src/main/java/org/apache/drill/exec/store/mapr/db/binary/CompareFunctionsProcessor.java
---
    @@ -82,466 +45,37 @@ public static CompareFunctionsProcessor process(FunctionCall call,
boolean nullC
             LogicalExpression swapArg = valueArg;
             valueArg = nameArg;
             nameArg = swapArg;
    -        evaluator.functionName = COMPARE_FUNCTIONS_TRANSPOSE_MAP.get(functionName);
    +        evaluator.setFunctionName(COMPARE_FUNCTIONS_TRANSPOSE_MAP.get(functionName));
           }
    -      evaluator.success = nameArg.accept(evaluator, valueArg);
    +      evaluator.setSuccess(nameArg.accept(evaluator, valueArg));
         } else if (nullComparatorSupported && call.args.get(0) instanceof SchemaPath)
{
    -      evaluator.success = true;
    -      evaluator.path = (SchemaPath) nameArg;
    +      evaluator.setSuccess(true);
    +      evaluator.setPath((SchemaPath) nameArg);
         }
     
         return evaluator;
       }
     
    -  public CompareFunctionsProcessor(String functionName) {
    -    this.success = false;
    -    this.functionName = functionName;
    -    this.isEqualityFn = COMPARE_FUNCTIONS_TRANSPOSE_MAP.containsKey(functionName)
    -        && COMPARE_FUNCTIONS_TRANSPOSE_MAP.get(functionName).equals(functionName);
    -    this.isRowKeyPrefixComparison = false;
    -    this.sortOrderAscending = true;
    -  }
    -
    -  public byte[] getValue() {
    -    return value;
    -  }
    -
    -  public boolean isSuccess() {
    -    return success;
    -  }
    -
    -  public SchemaPath getPath() {
    -    return path;
    -  }
    -
    -  public String getFunctionName() {
    -    return functionName;
    -  }
    -
    -  public boolean isRowKeyPrefixComparison() {
    -	return isRowKeyPrefixComparison;
    -  }
    -
    -  public byte[] getRowKeyPrefixStartRow() {
    -    return rowKeyPrefixStartRow;
    -  }
    -
    -  public byte[] getRowKeyPrefixStopRow() {
    -  return rowKeyPrefixStopRow;
    -  }
    -
    -  public Filter getRowKeyPrefixFilter() {
    -  return rowKeyPrefixFilter;
    -  }
    -
    -  public boolean isSortOrderAscending() {
    -    return sortOrderAscending;
    -  }
    -
       @Override
    -  public Boolean visitCastExpression(CastExpression e, LogicalExpression valueArg) throws
RuntimeException {
    -    if (e.getInput() instanceof CastExpression || e.getInput() instanceof SchemaPath)
{
    -      return e.getInput().accept(this, valueArg);
    -    }
    -    return false;
    -  }
    -
    -  @Override
    -  public Boolean visitConvertExpression(ConvertExpression e, LogicalExpression valueArg)
throws RuntimeException {
    -    if (e.getConvertFunction() == ConvertExpression.CONVERT_FROM) {
    -
    -      String encodingType = e.getEncodingType();
    -      int prefixLength    = 0;
    -
    -      // Handle scan pruning in the following scenario:
    -      // The row-key is a composite key and the CONVERT_FROM() function has byte_substr()
as input function which is
    -      // querying for the first few bytes of the row-key(start-offset 1)
    -      // Example WHERE clause:
    -      // CONVERT_FROM(BYTE_SUBSTR(row_key, 1, 8), 'DATE_EPOCH_BE') < DATE '2015-06-17'
    -      if (e.getInput() instanceof FunctionCall) {
    -
    -        // We can prune scan range only for big-endian encoded data
    -        if (encodingType.endsWith("_BE") == false) {
    -          return false;
    -        }
    -
    -        FunctionCall call = (FunctionCall)e.getInput();
    -        String functionName = call.getName();
    -        if (!functionName.equalsIgnoreCase("byte_substr")) {
    -          return false;
    -        }
    -
    -        LogicalExpression nameArg = call.args.get(0);
    -        LogicalExpression valueArg1 = call.args.size() >= 2 ? call.args.get(1) : null;
    -        LogicalExpression valueArg2 = call.args.size() >= 3 ? call.args.get(2) : null;
    -
    -        if (((nameArg instanceof SchemaPath) == false) ||
    -             (valueArg1 == null) || ((valueArg1 instanceof IntExpression) == false) ||
    -             (valueArg2 == null) || ((valueArg2 instanceof IntExpression) == false))
{
    -          return false;
    -        }
    -
    -        boolean isRowKey = ((SchemaPath)nameArg).getAsUnescapedPath().equals(DrillHBaseConstants.ROW_KEY);
    -        int offset = ((IntExpression)valueArg1).getInt();
    -
    -        if (!isRowKey || (offset != 1)) {
    -          return false;
    -        }
    -
    -        this.path    = (SchemaPath)nameArg;
    -        prefixLength = ((IntExpression)valueArg2).getInt();
    -        this.isRowKeyPrefixComparison = true;
    -        return visitRowKeyPrefixConvertExpression(e, prefixLength, valueArg);
    -      }
    -
    -      if (e.getInput() instanceof SchemaPath) {
    -        ByteBuf bb = null;
    -
    -        switch (encodingType) {
    -        case "INT_BE":
    -        case "INT":
    -        case "UINT_BE":
    -        case "UINT":
    -        case "UINT4_BE":
    -        case "UINT4":
    -          if (valueArg instanceof IntExpression
    -              && (isEqualityFn || encodingType.startsWith("U"))) {
    -            bb = newByteBuf(4, encodingType.endsWith("_BE"));
    -            bb.writeInt(((IntExpression)valueArg).getInt());
    -          }
    -          break;
    -        case "BIGINT_BE":
    -        case "BIGINT":
    -        case "UINT8_BE":
    -        case "UINT8":
    -          if (valueArg instanceof LongExpression
    -              && (isEqualityFn || encodingType.startsWith("U"))) {
    -            bb = newByteBuf(8, encodingType.endsWith("_BE"));
    -            bb.writeLong(((LongExpression)valueArg).getLong());
    -          }
    -          break;
    -        case "FLOAT":
    -          if (valueArg instanceof FloatExpression && isEqualityFn) {
    -            bb = newByteBuf(4, true);
    -            bb.writeFloat(((FloatExpression)valueArg).getFloat());
    -          }
    -          break;
    -        case "DOUBLE":
    -          if (valueArg instanceof DoubleExpression && isEqualityFn) {
    -            bb = newByteBuf(8, true);
    -            bb.writeDouble(((DoubleExpression)valueArg).getDouble());
    -          }
    -          break;
    -        case "TIME_EPOCH":
    -        case "TIME_EPOCH_BE":
    -          if (valueArg instanceof TimeExpression) {
    -            bb = newByteBuf(8, encodingType.endsWith("_BE"));
    -            bb.writeLong(((TimeExpression)valueArg).getTime());
    -          }
    -          break;
    -        case "DATE_EPOCH":
    -        case "DATE_EPOCH_BE":
    -          if (valueArg instanceof DateExpression) {
    -            bb = newByteBuf(8, encodingType.endsWith("_BE"));
    -            bb.writeLong(((DateExpression)valueArg).getDate());
    -          }
    -          break;
    -        case "BOOLEAN_BYTE":
    -          if (valueArg instanceof BooleanExpression) {
    -            bb = newByteBuf(1, false /* does not matter */);
    -            bb.writeByte(((BooleanExpression)valueArg).getBoolean() ? 1 : 0);
    -          }
    -          break;
    -        case "DOUBLE_OB":
    -        case "DOUBLE_OBD":
    -          if (valueArg instanceof DoubleExpression) {
    -            bb = newByteBuf(9, true);
    -            PositionedByteRange br = new SimplePositionedMutableByteRange(bb.array(),
0, 9);
    -            if (encodingType.endsWith("_OBD")) {
    -              org.apache.hadoop.hbase.util.OrderedBytes.encodeFloat64(br,
    -                  ((DoubleExpression)valueArg).getDouble(), Order.DESCENDING);
    -              this.sortOrderAscending = false;
    -            } else {
    -              org.apache.hadoop.hbase.util.OrderedBytes.encodeFloat64(br,
    -                  ((DoubleExpression)valueArg).getDouble(), Order.ASCENDING);
    -            }
    +  protected ByteBuf getByteBuf(LogicalExpression valueArg, String encodingType) {
    --- End diff --
    
    `org.apache.drill.exec.store.mapr.db.binary.CompareFunctionsProcessor` and `org.apache.drill.exec.store.hbase.CompareFunctionsProcessor`
classes contain almost the same code, so I moved mutual code to the abstract class `AbstractCompareFunctionsProcessor`.

    `visitConvertExpression()` method in the `mapr.db.binary.CompareFunctionsProcessor` contains
`UTF8_OB` and `UTF8_OBD` cases in the switch block, but this method in `hbase.CompareFunctionsProcessor`
class does not contain them, so I added a default case to the method in the abstract class
which calls `getByteBuf()` method which considers this difference between the methods.
    
    As I understand, this code is used for **scan pruning** when used `convert_from` function,
so we are using byte buffers there.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

Mime
View raw message