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.operator.scalar.JsonExtract.BooleanJsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.DoubleJsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.JsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.JsonValueJsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.LongJsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.ScalarValueJsonExtractor;
 import static com.facebook.presto.operator.scalar.JsonExtract.generateExtractor;
 import static com.facebook.presto.type.TypeUtils.parameterizedTypeName;
 import static java.lang.String.format;
 import static java.lang.invoke.MethodHandles.lookup;
 
 public class MapSubscriptOperator
         extends ParametricOperator
 {
     public static final MapSubscriptOperator MAP_SUBSCRIPT = new MapSubscriptOperator();
 
     private static final LoadingCache<CacheKeyJsonExtractor<?>> CACHE = CacheBuilder.newBuilder()
             .expireAfterAccess(1, .)
             .maximumSize(1000)
             .build(new CacheLoader<CacheKeyJsonExtractor<?>>()
             {
                 @Override
                 public JsonExtractor<?> load(CacheKey key)
                         throws Exception
                 {
                     return generateExtractor(format("$[\"%s\"]"key.getKey()), key.getType().getExtractor());
                 }
             });
 
     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");
 
         Signature signature = new Signature(.name(), valueType.getTypeSignature(), parameterizedTypeName("map"keyType.getTypeSignature(), valueType.getTypeSignature()), keyType.getTypeSignature());
         return new FunctionInfo(signature"Map subscript"truelookupMethod(keyTypevalueType), truetrue, ImmutableList.of(falsefalse));
     }
 
     private static MethodHandle lookupMethod(Type keyTypeType valueType)
     {
         String methodName = keyType.getJavaType().getSimpleName();
         if (valueType instanceof ArrayType || valueType instanceof MapType || valueType instanceof RowType) {
             methodName += "Structural";
         }
         else {
             methodName += valueType.getJavaType().getSimpleName();
         }
         methodName += "Subscript";
         try {
             return lookup().unreflect(MapSubscriptOperator.class.getMethod(methodNameSlice.classkeyType.getJavaType()));
         }
         catch (IllegalAccessException | NoSuchMethodException e) {
             throw Throwables.propagate(e);
         }
     }
 
    public static Long SlicelongSubscript(Slice mapSlice key)
    {
        return subscript(mapkey.toStringUtf8(), .);
    }
    public static Boolean SlicebooleanSubscript(Slice mapSlice key)
    {
        return subscript(mapkey.toStringUtf8(), .);
    }
    public static Double SlicedoubleSubscript(Slice mapSlice key)
    {
        return subscript(mapkey.toStringUtf8(), .);
    }
    public static Slice SliceSliceSubscript(Slice mapSlice key)
    {
        return subscript(mapkey.toStringUtf8(), .);
    }
    public static Slice SliceStructuralSubscript(Slice mapSlice key)
    {
        return subscript(mapkey.toStringUtf8(), .);
    }
    public static Long doublelongSubscript(Slice mapdouble key)
    {
        return subscript(mapkey.);
    }
    public static Boolean doublebooleanSubscript(Slice mapdouble key)
    {
        return subscript(mapkey.);
    }
    public static Double doubledoubleSubscript(Slice mapdouble key)
    {
        return subscript(mapkey.);
    }
    public static Slice doubleSliceSubscript(Slice mapdouble key)
    {
        return subscript(mapkey.);
    }
    public static Slice doubleStructuralSubscript(Slice mapdouble key)
    {
        return subscript(mapkey.);
    }
    public static Long booleanlongSubscript(Slice mapboolean key)
    {
        return subscript(mapkey.);
    }
    public static Boolean booleanbooleanSubscript(Slice mapboolean key)
    {
        return subscript(mapkey.);
    }
    public static Double booleandoubleSubscript(Slice mapboolean key)
    {
        return subscript(mapkey.);
    }
    public static Slice booleanSliceSubscript(Slice mapboolean key)
    {
        return subscript(mapkey.);
    }
    public static Slice booleanStructuralSubscript(Slice mapboolean key)
    {
        return subscript(mapkey.);
    }
    public static Long longlongSubscript(Slice maplong key)
    {
        return subscript(mapkey.);
    }
    public static Boolean longbooleanSubscript(Slice maplong key)
    {
        return subscript(mapkey.);
    }
    public static Double longdoubleSubscript(Slice maplong key)
    {
        return subscript(mapkey.);
    }
    public static Slice longSliceSubscript(Slice maplong key)
    {
        return subscript(mapkey.);
    }
    public static Slice longStructuralSubscript(Slice maplong key)
    {
        return subscript(mapkey.);
    }
    @SuppressWarnings("unchecked")
    private static <T> T subscript(Slice mapObject keyExtractorType type)
    {
        JsonExtractor<?> extractor = .getUnchecked(new CacheKey(key.toString(), type));
        return (T) JsonExtract.extract(mapextractor);
    }
    private static class CacheKey
    {
        private final String key;
        private final ExtractorType type;
        private CacheKey(String keyExtractorType type)
        {
            this. = key;
            this. = type;
        }
        public String getKey()
        {
            return ;
        }
        public ExtractorType getType()
        {
            return ;
        }
        @Override
        public boolean equals(Object o)
        {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            CacheKey cacheKey = (CacheKeyo;
            if (!.equals(cacheKey.key)) {
                return false;
            }
            if ( != cacheKey.type) {
                return false;
            }
            return true;
        }
        @Override
        public int hashCode()
        {
            int result = .hashCode();
            result = 31 * result + .hashCode();
            return result;
        }
    }
    private enum ExtractorType
    {
        LONG(new LongJsonExtractor()),
        BOOLEAN(new BooleanJsonExtractor()),
        DOUBLE(new DoubleJsonExtractor()),
        SLICE(new ScalarValueJsonExtractor()),
        STRUCTURAL(new JsonValueJsonExtractor());
        private final JsonExtractor<?> extractor;
        ExtractorType(JsonExtractor<?> extractor)
        {
            this. = extractor;
        }
        public JsonExtractor<?> getExtractor()
        {
            return ;
        }
    }
New to GrepCode? Check out our FAQ X