Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. package com.facebook.presto.scuba.optimization.translator;
  2.  
  3. import com.facebook.presto.scuba.optimization.FilterPushdownScubaSql;
  4. import com.facebook.presto.scuba.optimization.functions.BigintOperators;
  5. import com.facebook.presto.scuba.optimization.functions.BooleanOperators;
  6. import com.facebook.presto.scuba.optimization.functions.DoubleOperators;
  7. import com.facebook.presto.scuba.optimization.functions.MathFunctions;
  8. import com.facebook.presto.scuba.optimization.functions.NotFunction;
  9. import com.facebook.presto.scuba.optimization.functions.RealOperators;
  10. import com.facebook.presto.scuba.optimization.functions.StringFunctions;
  11. import com.facebook.presto.scuba.optimization.functions.VarcharOperators;
  12. import com.facebook.presto.spi.function.FunctionMetadata;
  13. import com.google.common.collect.ImmutableMap;
  14.  
  15. import java.lang.invoke.MethodHandle;
  16. import java.util.Arrays;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Optional;
  20. import java.util.stream.Collectors;
  21.  
  22. import static com.facebook.presto.scuba.optimization.FilterPushdownScubaSql.PushdownState.FULLY_PUSHABLE;
  23. import static com.facebook.presto.scuba.optimization.FilterPushdownScubaSql.notPushable;
  24. import static com.facebook.presto.scuba.optimization.ScubaScalarFromAnnotationsParser.parseFunctionDefinitions;
  25. import static com.facebook.presto.scuba.optimization.ScubaScalarFromAnnotationsParser.removeTypeParameters;
  26. import static java.lang.String.format;
  27.  
  28. public class FunctionTranslator
  29. {
  30. private final Map<FunctionMetadata, MethodHandle> translators;
  31.  
  32. public FunctionTranslator()
  33. {
  34. this.translators = registerFunctions();
  35. }
  36.  
  37. public static FilterPushdownScubaSql binaryOperatorTranslator(FilterPushdownScubaSql left, FilterPushdownScubaSql right, String operator)
  38. {
  39. if (!left.isFullyPushable() || !right.isFullyPushable()) {
  40. return notPushable();
  41. }
  42.  
  43. return new FilterPushdownScubaSql(FULLY_PUSHABLE, Optional.of(format("(%s) %s (%s)", left.getScubaSQL(), operator, right.getScubaSQL())));
  44. }
  45.  
  46. public static FilterPushdownScubaSql functionTranslator(String function, FilterPushdownScubaSql... arguments)
  47. {
  48. if (!Arrays.stream(arguments).allMatch(FilterPushdownScubaSql::isFullyPushable)) {
  49. return notPushable();
  50. }
  51.  
  52. String translatedFunction = function + "(" + Arrays.stream(arguments).map(FilterPushdownScubaSql::getScubaSQL).collect(Collectors.joining(", ")) + ")";
  53.  
  54. return new FilterPushdownScubaSql(FULLY_PUSHABLE, Optional.of(translatedFunction));
  55. }
  56.  
  57. public FilterPushdownScubaSql translate(FunctionMetadata functionSignature, List<FilterPushdownScubaSql> arguments)
  58. {
  59. MethodHandle methodHandle = translators.get(removeTypeParameters(functionSignature));
  60.  
  61. if (methodHandle == null) {
  62. return notPushable();
  63. }
  64.  
  65. try {
  66. return (FilterPushdownScubaSql) methodHandle.invokeWithArguments(arguments);
  67. }
  68. catch (RuntimeException e) {
  69. throw e;
  70. }
  71. catch (Throwable t) {
  72. if (t instanceof InterruptedException) {
  73. Thread.currentThread().interrupt();
  74. }
  75. throw new RuntimeException(t);
  76. }
  77. }
  78.  
  79. private Map<FunctionMetadata, MethodHandle> registerFunctions()
  80. {
  81. ImmutableMap.Builder<FunctionMetadata, MethodHandle> functions = ImmutableMap.builder();
  82. functions.putAll(parseFunctionDefinitions(BooleanOperators.class))
  83. .putAll(parseFunctionDefinitions(BigintOperators.class))
  84. .putAll(parseFunctionDefinitions(DoubleOperators.class))
  85. .putAll(parseFunctionDefinitions(VarcharOperators.class))
  86. .putAll(parseFunctionDefinitions(RealOperators.class))
  87. .putAll(parseFunctionDefinitions(NotFunction.class))
  88. .putAll(parseFunctionDefinitions(MathFunctions.class))
  89. .putAll(parseFunctionDefinitions(StringFunctions.class));
  90.  
  91. return functions.build();
  92. }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement