Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.facebook.presto.operator.scalar;
 
 
 import java.util.Map;
 
 import static com.facebook.presto.metadata.OperatorType.SUBSCRIPT;
 import static com.facebook.presto.metadata.Signature.typeParameter;
 import static com.facebook.presto.spi.StandardErrorCode.INTERNAL_ERROR;
 import static com.facebook.presto.type.TypeUtils.castValue;
 import static com.facebook.presto.type.TypeUtils.parameterizedTypeName;
 import static com.facebook.presto.type.TypeUtils.readStructuralBlock;
 import static java.lang.invoke.MethodHandles.lookup;
 
 public class MapSubscriptOperator
         extends ParametricOperator
 {
     public static final MapSubscriptOperator MAP_SUBSCRIPT = new MapSubscriptOperator();
 
     protected MapSubscriptOperator()
     {
         super(, ImmutableList.of(typeParameter("K"), typeParameter("V")), "V", ImmutableList.of("map<K,V>""K"));
     }
 
     @Override
     public FunctionInfo specialize(Map<StringTypetypesint arityTypeManager typeManagerFunctionRegistry functionRegistry)
     {
         Type keyType = types.get("K");
         Type valueType = types.get("V");
 
         MethodHandle keyEqualsMethod = functionRegistry.resolveOperator(., ImmutableList.of(keyTypekeyType)).getMethodHandle();
 
         MethodHandle methodHandle = lookupMethod(keyTypevalueType);
         methodHandle = methodHandle.bindTo(keyEqualsMethod).bindTo(keyType).bindTo(valueType);
 
         Signature signature = new Signature(.name(), valueType.getTypeSignature(), parameterizedTypeName("map"keyType.getTypeSignature(), valueType.getTypeSignature()), keyType.getTypeSignature());
         return new FunctionInfo(signature"Map subscript"truemethodHandletruetrue, ImmutableList.of(falsefalse));
     }
 
     private static MethodHandle lookupMethod(Type keyTypeType valueType)
     {
         String methodName = keyType.getJavaType().getSimpleName();
         methodName += valueType.getJavaType().getSimpleName();
         methodName += "Subscript";
         try {
             return lookup().unreflect(MapSubscriptOperator.class.getMethod(methodNameMethodHandle.classType.classType.classSlice.classkeyType.getJavaType()));
         }
         catch (IllegalAccessException | NoSuchMethodException e) {
             throw Throwables.propagate(e);
         }
     }
 
     public static void longvoidSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice maplong key)
     {
     }
 
     public static void SlicevoidSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapSlice key)
     {
     }
 
     public static void booleanvoidSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapboolean key)
     {
     }
 
     public static void doublevoidSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapdouble key)
     {
     }
 
     public static Long SlicelongSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapSlice key)
     {
         return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
     }
 
     public static Boolean SlicebooleanSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapSlice key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Double SlicedoubleSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapSlice key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Slice SliceSliceSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapSlice key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Long doublelongSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapdouble key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Boolean doublebooleanSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapdouble key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Double doubledoubleSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapdouble key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Slice doubleSliceSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapdouble key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Long booleanlongSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapboolean key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Boolean booleanbooleanSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapboolean key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Double booleandoubleSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapboolean key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Slice booleanSliceSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapboolean key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Long longlongSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice maplong key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Boolean longbooleanSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice maplong key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Double longdoubleSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice maplong key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    public static Slice longSliceSubscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice maplong key)
    {
        return subscript(keyEqualsMethodkeyTypevalueTypemapkey);
    }
    @SuppressWarnings("unchecked")
    private static <T> T subscript(MethodHandle keyEqualsMethodType keyTypeType valueTypeSlice mapObject key)
    {
        Block block = readStructuralBlock(map);
        int position = 0;
        Class<?> keyTypeJavaType = keyType.getJavaType();
        for (; position < block.getPositionCount(); position += 2) {
            try {
                boolean equals;
                if (keyTypeJavaType == long.class) {
                    equals = (booleankeyEqualsMethod.invokeExact(keyType.getLong(blockposition), (longkey);
                }
                else if (keyTypeJavaType == double.class) {
                    equals = (booleankeyEqualsMethod.invokeExact(keyType.getDouble(blockposition), (doublekey);
                }
                else if (keyTypeJavaType == boolean.class) {
                    equals = (booleankeyEqualsMethod.invokeExact(keyType.getBoolean(blockposition), (booleankey);
                }
                else if (keyTypeJavaType == Slice.class) {
                    equals = (booleankeyEqualsMethod.invokeExact(keyType.getSlice(blockposition), (Slicekey);
                }
                else {
                    throw new IllegalArgumentException("Unsupported type: " + keyTypeJavaType.getSimpleName());
                }
                if (equals) {
                    break;
                }
            }
            catch (Throwable t) {
                    Throwables.propagateIfInstanceOf(tError.class);
                    Throwables.propagateIfInstanceOf(tPrestoException.class);
                    throw new PrestoException(t);
                }
            }
        if (position == block.getPositionCount()) {
            // key not found
            return null;
        }
        position += 1; // value position
        return (T) castValue(valueTypeblockposition);
    }
New to GrepCode? Check out our FAQ X