JMap.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:9k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.record.compiler;
  19. import java.util.Map;
  20. /**
  21.  */
  22. public class JMap extends JCompType {
  23.   
  24.   static private int level = 0;
  25.   
  26.   static private String getLevel() { return Integer.toString(level); }
  27.   
  28.   static private void incrLevel() { level++; }
  29.   
  30.   static private void decrLevel() { level--; }
  31.   
  32.   static private String getId(String id) { return id+getLevel(); }
  33.   
  34.   private JType keyType;
  35.   private JType valueType;
  36.   
  37.   class JavaMap extends JavaCompType {
  38.     
  39.     JType.JavaType key;
  40.     JType.JavaType value;
  41.     
  42.     JavaMap(JType.JavaType key, JType.JavaType value) {
  43.       super("java.util.TreeMap<"+key.getWrapperType()+","+value.getWrapperType()+">",
  44.             "Map",
  45.             "java.util.TreeMap<"+key.getWrapperType()+","+value.getWrapperType()+">",
  46.             "TypeID.RIOType.MAP");
  47.       this.key = key;
  48.       this.value = value;
  49.     }
  50.     
  51.     String getTypeIDObjectString() {
  52.       return "new org.apache.hadoop.record.meta.MapTypeID(" + 
  53.         key.getTypeIDObjectString() + ", " + 
  54.         value.getTypeIDObjectString() + ")";
  55.     }
  56.     void genSetRTIFilter(CodeBuffer cb, Map<String, Integer> nestedStructMap) {
  57.       key.genSetRTIFilter(cb, nestedStructMap);
  58.       value.genSetRTIFilter(cb, nestedStructMap);
  59.     }
  60.     void genCompareTo(CodeBuffer cb, String fname, String other) {
  61.       String setType = "java.util.Set<"+key.getWrapperType()+"> ";
  62.       String iterType = "java.util.Iterator<"+key.getWrapperType()+"> ";
  63.       cb.append("{n");
  64.       cb.append(setType+getId(Consts.RIO_PREFIX + "set1")+" = "+
  65.           fname+".keySet();n");
  66.       cb.append(setType+getId(Consts.RIO_PREFIX + "set2")+" = "+
  67.           other+".keySet();n");
  68.       cb.append(iterType+getId(Consts.RIO_PREFIX + "miter1")+" = "+
  69.                 getId(Consts.RIO_PREFIX + "set1")+".iterator();n");
  70.       cb.append(iterType+getId(Consts.RIO_PREFIX + "miter2")+" = "+
  71.                 getId(Consts.RIO_PREFIX + "set2")+".iterator();n");
  72.       cb.append("for(; "+getId(Consts.RIO_PREFIX + "miter1")+".hasNext() && "+
  73.                 getId(Consts.RIO_PREFIX + "miter2")+".hasNext();) {n");
  74.       cb.append(key.getType()+" "+getId(Consts.RIO_PREFIX + "k1")+
  75.                 " = "+getId(Consts.RIO_PREFIX + "miter1")+".next();n");
  76.       cb.append(key.getType()+" "+getId(Consts.RIO_PREFIX + "k2")+
  77.                 " = "+getId(Consts.RIO_PREFIX + "miter2")+".next();n");
  78.       key.genCompareTo(cb, getId(Consts.RIO_PREFIX + "k1"), 
  79.           getId(Consts.RIO_PREFIX + "k2"));
  80.       cb.append("if (" + Consts.RIO_PREFIX + "ret != 0) { return " + 
  81.           Consts.RIO_PREFIX + "ret; }n");
  82.       cb.append("}n");
  83.       cb.append(Consts.RIO_PREFIX + "ret = ("+getId(Consts.RIO_PREFIX + "set1")+
  84.           ".size() - "+getId(Consts.RIO_PREFIX + "set2")+".size());n");
  85.       cb.append("}n");
  86.     }
  87.     
  88.     void genReadMethod(CodeBuffer cb, String fname, String tag, boolean decl) {
  89.       if (decl) {
  90.         cb.append(getType()+" "+fname+";n");
  91.       }
  92.       cb.append("{n");
  93.       incrLevel();
  94.       cb.append("org.apache.hadoop.record.Index " + 
  95.           getId(Consts.RIO_PREFIX + "midx")+" = " + 
  96.           Consts.RECORD_INPUT + ".startMap(""+tag+"");n");
  97.       cb.append(fname+"=new "+getType()+"();n");
  98.       cb.append("for (; !"+getId(Consts.RIO_PREFIX + "midx")+".done(); "+
  99.           getId(Consts.RIO_PREFIX + "midx")+".incr()) {n");
  100.       key.genReadMethod(cb, getId(Consts.RIO_PREFIX + "k"),
  101.           getId(Consts.RIO_PREFIX + "k"), true);
  102.       value.genReadMethod(cb, getId(Consts.RIO_PREFIX + "v"), 
  103.           getId(Consts.RIO_PREFIX + "v"), true);
  104.       cb.append(fname+".put("+getId(Consts.RIO_PREFIX + "k")+","+
  105.           getId(Consts.RIO_PREFIX + "v")+");n");
  106.       cb.append("}n");
  107.       cb.append(Consts.RECORD_INPUT + ".endMap(""+tag+"");n");
  108.       decrLevel();
  109.       cb.append("}n");
  110.     }
  111.     
  112.     void genWriteMethod(CodeBuffer cb, String fname, String tag) {
  113.       String setType = "java.util.Set<java.util.Map.Entry<"+
  114.         key.getWrapperType()+","+value.getWrapperType()+">> ";
  115.       String entryType = "java.util.Map.Entry<"+
  116.         key.getWrapperType()+","+value.getWrapperType()+"> ";
  117.       String iterType = "java.util.Iterator<java.util.Map.Entry<"+
  118.         key.getWrapperType()+","+value.getWrapperType()+">> ";
  119.       cb.append("{n");
  120.       incrLevel();
  121.       cb.append(Consts.RECORD_OUTPUT + ".startMap("+fname+",""+tag+"");n");
  122.       cb.append(setType+getId(Consts.RIO_PREFIX + "es")+" = "+
  123.           fname+".entrySet();n");
  124.       cb.append("for("+iterType+getId(Consts.RIO_PREFIX + "midx")+" = "+
  125.           getId(Consts.RIO_PREFIX + "es")+".iterator(); "+
  126.           getId(Consts.RIO_PREFIX + "midx")+".hasNext();) {n");
  127.       cb.append(entryType+getId(Consts.RIO_PREFIX + "me")+" = "+
  128.           getId(Consts.RIO_PREFIX + "midx")+".next();n");
  129.       cb.append(key.getType()+" "+getId(Consts.RIO_PREFIX + "k")+" = "+
  130.           getId(Consts.RIO_PREFIX + "me")+".getKey();n");
  131.       cb.append(value.getType()+" "+getId(Consts.RIO_PREFIX + "v")+" = "+
  132.           getId(Consts.RIO_PREFIX + "me")+".getValue();n");
  133.       key.genWriteMethod(cb, getId(Consts.RIO_PREFIX + "k"), 
  134.           getId(Consts.RIO_PREFIX + "k"));
  135.       value.genWriteMethod(cb, getId(Consts.RIO_PREFIX + "v"), 
  136.           getId(Consts.RIO_PREFIX + "v"));
  137.       cb.append("}n");
  138.       cb.append(Consts.RECORD_OUTPUT + ".endMap("+fname+",""+tag+"");n");
  139.       cb.append("}n");
  140.       decrLevel();
  141.     }
  142.     
  143.     void genSlurpBytes(CodeBuffer cb, String b, String s, String l) {
  144.       cb.append("{n");
  145.       incrLevel();
  146.       cb.append("int "+getId("mi")+
  147.                 " = org.apache.hadoop.record.Utils.readVInt("+b+", "+s+");n");
  148.       cb.append("int "+getId("mz")+
  149.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("mi")+");n");
  150.       cb.append(s+"+="+getId("mz")+"; "+l+"-="+getId("mz")+";n");
  151.       cb.append("for (int "+getId("midx")+" = 0; "+getId("midx")+
  152.                 " < "+getId("mi")+"; "+getId("midx")+"++) {");
  153.       key.genSlurpBytes(cb, b, s, l);
  154.       value.genSlurpBytes(cb, b, s, l);
  155.       cb.append("}n");
  156.       decrLevel();
  157.       cb.append("}n");
  158.     }
  159.     
  160.     void genCompareBytes(CodeBuffer cb) {
  161.       cb.append("{n");
  162.       incrLevel();
  163.       cb.append("int "+getId("mi1")+
  164.                 " = org.apache.hadoop.record.Utils.readVInt(b1, s1);n");
  165.       cb.append("int "+getId("mi2")+
  166.                 " = org.apache.hadoop.record.Utils.readVInt(b2, s2);n");
  167.       cb.append("int "+getId("mz1")+
  168.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("mi1")+");n");
  169.       cb.append("int "+getId("mz2")+
  170.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("mi2")+");n");
  171.       cb.append("s1+="+getId("mz1")+"; s2+="+getId("mz2")+
  172.                 "; l1-="+getId("mz1")+"; l2-="+getId("mz2")+";n");
  173.       cb.append("for (int "+getId("midx")+" = 0; "+getId("midx")+
  174.                 " < "+getId("mi1")+" && "+getId("midx")+" < "+getId("mi2")+
  175.                 "; "+getId("midx")+"++) {");
  176.       key.genCompareBytes(cb);
  177.       value.genSlurpBytes(cb, "b1", "s1", "l1");
  178.       value.genSlurpBytes(cb, "b2", "s2", "l2");
  179.       cb.append("}n");
  180.       cb.append("if ("+getId("mi1")+" != "+getId("mi2")+
  181.                 ") { return ("+getId("mi1")+"<"+getId("mi2")+")?-1:0; }n");
  182.       decrLevel();
  183.       cb.append("}n");
  184.     }
  185.   }
  186.   
  187.   class CppMap extends CppCompType {
  188.     
  189.     JType.CppType key;
  190.     JType.CppType value;
  191.     
  192.     CppMap(JType.CppType key, JType.CppType value) {
  193.       super("::std::map< "+key.getType()+", "+ value.getType()+" >");
  194.       this.key = key;
  195.       this.value = value;
  196.     }
  197.     
  198.     String getTypeIDObjectString() {
  199.       return "new ::hadoop::MapTypeID(" + 
  200.         key.getTypeIDObjectString() + ", " + 
  201.         value.getTypeIDObjectString() + ")";
  202.     }
  203.     void genSetRTIFilter(CodeBuffer cb) {
  204.       key.genSetRTIFilter(cb);
  205.       value.genSetRTIFilter(cb);
  206.     }
  207.   }
  208.   
  209.   /** Creates a new instance of JMap */
  210.   public JMap(JType t1, JType t2) {
  211.     setJavaType(new JavaMap(t1.getJavaType(), t2.getJavaType()));
  212.     setCppType(new CppMap(t1.getCppType(), t2.getCppType()));
  213.     setCType(new CType());
  214.     keyType = t1;
  215.     valueType = t2;
  216.   }
  217.   
  218.   String getSignature() {
  219.     return "{" + keyType.getSignature() + valueType.getSignature() +"}";
  220.   }
  221. }