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 
19 package org.apache.hadoop.record.compiler;
20 
21 import java.util.Map;
22 
23 /**
24  */
25 public class JVector extends JCompType {
26 
27   static private int level = 0;
28 
getId(String id)29   static private String getId(String id) { return id+getLevel(); }
30 
getLevel()31   static private String getLevel() { return Integer.toString(level); }
32 
incrLevel()33   static private void incrLevel() { level++; }
34 
decrLevel()35   static private void decrLevel() { level--; }
36 
37   private JType type;
38 
39   class JavaVector extends JavaCompType {
40 
41     private JType.JavaType element;
42 
JavaVector(JType.JavaType t)43     JavaVector(JType.JavaType t) {
44       super("java.util.ArrayList<"+t.getWrapperType()+">",
45             "Vector", "java.util.ArrayList<"+t.getWrapperType()+">",
46             "TypeID.RIOType.VECTOR");
47       element = t;
48     }
49 
getTypeIDObjectString()50     String getTypeIDObjectString() {
51       return "new org.apache.hadoop.record.meta.VectorTypeID(" +
52       element.getTypeIDObjectString() + ")";
53     }
54 
genSetRTIFilter(CodeBuffer cb, Map<String, Integer> nestedStructMap)55     void genSetRTIFilter(CodeBuffer cb, Map<String, Integer> nestedStructMap) {
56       element.genSetRTIFilter(cb, nestedStructMap);
57     }
58 
genCompareTo(CodeBuffer cb, String fname, String other)59     void genCompareTo(CodeBuffer cb, String fname, String other) {
60       cb.append("{\n");
61       incrLevel();
62       cb.append("int "+getId(Consts.RIO_PREFIX + "len1")+" = "+fname+
63           ".size();\n");
64       cb.append("int "+getId(Consts.RIO_PREFIX + "len2")+" = "+other+
65           ".size();\n");
66       cb.append("for(int "+getId(Consts.RIO_PREFIX + "vidx")+" = 0; "+
67           getId(Consts.RIO_PREFIX + "vidx")+"<"+getId(Consts.RIO_PREFIX + "len1")+
68           " && "+getId(Consts.RIO_PREFIX + "vidx")+"<"+
69           getId(Consts.RIO_PREFIX + "len2")+"; "+
70           getId(Consts.RIO_PREFIX + "vidx")+"++) {\n");
71       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e1")+
72                 " = "+fname+
73                 ".get("+getId(Consts.RIO_PREFIX + "vidx")+");\n");
74       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e2")+
75                 " = "+other+
76                 ".get("+getId(Consts.RIO_PREFIX + "vidx")+");\n");
77       element.genCompareTo(cb, getId(Consts.RIO_PREFIX + "e1"),
78           getId(Consts.RIO_PREFIX + "e2"));
79       cb.append("if (" + Consts.RIO_PREFIX + "ret != 0) { return " +
80           Consts.RIO_PREFIX + "ret; }\n");
81       cb.append("}\n");
82       cb.append(Consts.RIO_PREFIX + "ret = ("+getId(Consts.RIO_PREFIX + "len1")+
83           " - "+getId(Consts.RIO_PREFIX + "len2")+");\n");
84       decrLevel();
85       cb.append("}\n");
86     }
87 
genReadMethod(CodeBuffer cb, String fname, String tag, boolean decl)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 + "vidx")+" = " +
96           Consts.RECORD_INPUT + ".startVector(\""+tag+"\");\n");
97       cb.append(fname+"=new "+getType()+"();\n");
98       cb.append("for (; !"+getId(Consts.RIO_PREFIX + "vidx")+".done(); " +
99           getId(Consts.RIO_PREFIX + "vidx")+".incr()) {\n");
100       element.genReadMethod(cb, getId(Consts.RIO_PREFIX + "e"),
101           getId(Consts.RIO_PREFIX + "e"), true);
102       cb.append(fname+".add("+getId(Consts.RIO_PREFIX + "e")+");\n");
103       cb.append("}\n");
104       cb.append(Consts.RECORD_INPUT + ".endVector(\""+tag+"\");\n");
105       decrLevel();
106       cb.append("}\n");
107     }
108 
genWriteMethod(CodeBuffer cb, String fname, String tag)109     void genWriteMethod(CodeBuffer cb, String fname, String tag) {
110       cb.append("{\n");
111       incrLevel();
112       cb.append(Consts.RECORD_OUTPUT + ".startVector("+fname+",\""+tag+"\");\n");
113       cb.append("int "+getId(Consts.RIO_PREFIX + "len")+" = "+fname+".size();\n");
114       cb.append("for(int "+getId(Consts.RIO_PREFIX + "vidx")+" = 0; " +
115           getId(Consts.RIO_PREFIX + "vidx")+"<"+getId(Consts.RIO_PREFIX + "len")+
116           "; "+getId(Consts.RIO_PREFIX + "vidx")+"++) {\n");
117       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e")+" = "+
118           fname+".get("+getId(Consts.RIO_PREFIX + "vidx")+");\n");
119       element.genWriteMethod(cb, getId(Consts.RIO_PREFIX + "e"),
120           getId(Consts.RIO_PREFIX + "e"));
121       cb.append("}\n");
122       cb.append(Consts.RECORD_OUTPUT + ".endVector("+fname+",\""+tag+"\");\n");
123       cb.append("}\n");
124       decrLevel();
125     }
126 
genSlurpBytes(CodeBuffer cb, String b, String s, String l)127     void genSlurpBytes(CodeBuffer cb, String b, String s, String l) {
128       cb.append("{\n");
129       incrLevel();
130       cb.append("int "+getId("vi")+
131                 " = org.apache.hadoop.record.Utils.readVInt("+b+", "+s+");\n");
132       cb.append("int "+getId("vz")+
133                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi")+");\n");
134       cb.append(s+"+="+getId("vz")+"; "+l+"-="+getId("vz")+";\n");
135       cb.append("for (int "+getId("vidx")+" = 0; "+getId("vidx")+
136                 " < "+getId("vi")+"; "+getId("vidx")+"++)");
137       element.genSlurpBytes(cb, b, s, l);
138       decrLevel();
139       cb.append("}\n");
140     }
141 
genCompareBytes(CodeBuffer cb)142     void genCompareBytes(CodeBuffer cb) {
143       cb.append("{\n");
144       incrLevel();
145       cb.append("int "+getId("vi1")+
146                 " = org.apache.hadoop.record.Utils.readVInt(b1, s1);\n");
147       cb.append("int "+getId("vi2")+
148                 " = org.apache.hadoop.record.Utils.readVInt(b2, s2);\n");
149       cb.append("int "+getId("vz1")+
150                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi1")+");\n");
151       cb.append("int "+getId("vz2")+
152                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi2")+");\n");
153       cb.append("s1+="+getId("vz1")+"; s2+="+getId("vz2")+
154                 "; l1-="+getId("vz1")+"; l2-="+getId("vz2")+";\n");
155       cb.append("for (int "+getId("vidx")+" = 0; "+getId("vidx")+
156                 " < "+getId("vi1")+" && "+getId("vidx")+" < "+getId("vi2")+
157                 "; "+getId("vidx")+"++)");
158       element.genCompareBytes(cb);
159       cb.append("if ("+getId("vi1")+" != "+getId("vi2")+
160                 ") { return ("+getId("vi1")+"<"+getId("vi2")+")?-1:0; }\n");
161       decrLevel();
162       cb.append("}\n");
163     }
164   }
165 
166   class CppVector extends CppCompType {
167 
168     private JType.CppType element;
169 
CppVector(JType.CppType t)170     CppVector(JType.CppType t) {
171       super("::std::vector< "+t.getType()+" >");
172       element = t;
173     }
174 
getTypeIDObjectString()175     String getTypeIDObjectString() {
176       return "new ::hadoop::VectorTypeID(" +
177       element.getTypeIDObjectString() + ")";
178     }
179 
genSetRTIFilter(CodeBuffer cb)180     void genSetRTIFilter(CodeBuffer cb) {
181       element.genSetRTIFilter(cb);
182     }
183 
184   }
185 
186   /** Creates a new instance of JVector */
JVector(JType t)187   public JVector(JType t) {
188     type = t;
189     setJavaType(new JavaVector(t.getJavaType()));
190     setCppType(new CppVector(t.getCppType()));
191     setCType(new CCompType());
192   }
193 
getSignature()194   String getSignature() {
195     return "[" + type.getSignature() + "]";
196   }
197 }
198