sorry, the previous email is incomplete. For the ifBlock, do you need an _else() block also ?
I have sometimes found that 'JConditional' is a good way to break down the logic further. Please see example usages of JConditional here [1]. -Aman [1] https://www.programcreek.com/java-api-examples/?api=com.sun.codemodel.JBlock On Mon, May 28, 2018 at 7:46 PM, Aman Sinha <[email protected]> wrote: > Hi Weijie, > It would be a little cumbersome to debug such issues over email since one > has to look at the generated code output and iteratively debug. > Couple of thoughts I have that might help: > > For this particular if-then block, should you also > JBlock ifBlock = > cg.getEvalBlock()._if(fieldIdParamHolder.getValue().eq(targe > tBuildSideFieldId))._then(); > > > > On Mon, May 28, 2018 at 4:17 AM, weijie tong <[email protected]> > wrote: > >> HI All: >> Through implementing the JPPD feature ( >> https://issues.apache.org/jira/browse/DRILL-6385) , I was blocked by the >> problem: how to get the hash code of each build side of the hash join >> columns through the dynamic generated java code. Hope someone can give >> some >> advice. >> >> I supposed to add methods as below to the HashTableTemplate : >> >> public long getBuild64HashCode(int incomingRowIdx, int seedValue, int >> fieldId) throws SchemaChangeException{ >> return getBuild64HashCodeInner(incomingRowIdx, seedValue, fieldId); >> } >> >> protected abstract long >> getBuild64HashCodeInner(@Named("incomingRowIdx") int incomingRowIdx, >> @Named("seedValue") int seedValue, @Named("fieldId") int fieldId) >> throws SchemaChangeException; >> >> >> The high level code to invoke the getBuild64HashCode method is at the >> HashJoinBatch's executeBuildPhase() : >> >> //create runtime filter >> if (cycleNum == 0 && enableRuntimeFilter) { >> //create runtime filter and send out async >> int condFieldIndex = 0; >> for (BloomFilter bloomFilter : bloomFilters) { >> //VV >> for (int ind = 0; ind < currentRecordCount; ind++) { >> long hashCode = partitions[0].getBuild64HashCode(ind, >> condFieldIndex); >> bloomFilter.insert(hashCode); >> } >> condFieldIndex++; >> } >> //TODO sered out async >> } >> >> >> As you know, the abstract method getBuild64HashCodeInner needs to >> calculate the hash codes of each build side column by the fieldId input >> parameter. In order to achieve this target, I plan to have different >> solving parts corresponding to different column ValueVector , using the if >> statement to distinguish different solving parts through the id of the >> column. The corresponding method to generate the dynamic codes is as >> below: >> >> private void setupGetBuild64Hash(ClassGenerator<HashTable> cg, >> MappingSet incomingMapping, VectorAccessible batch, >> LogicalExpression[] keyExprs, TypedFieldId[] buildKeyFieldIds) >> throws SchemaChangeException { >> cg.setMappingSet(incomingMapping); >> if (keyExprs == null || keyExprs.length == 0) { >> cg.getEvalBlock()._return(JExpr.lit(0)); >> } >> String seedValue = "seedValue"; >> String fieldId = "fieldId"; >> LogicalExpression seed = >> ValueExpressions.getParameterExpression(seedValue, >> Types.required(TypeProtos.MinorType.INT)); >> >> LogicalExpression fieldIdParamExpr = >> ValueExpressions.getParameterExpression(fieldId, >> Types.required(TypeProtos.MinorType.INT) ); >> HoldingContainer fieldIdParamHolder = cg.addExpr(fieldIdParamExpr); >> int i = 0; >> for (LogicalExpression expr : keyExprs) { >> TypedFieldId targetTypeFieldId = buildKeyFieldIds[i]; >> ValueExpressions.IntExpression targetBuildFieldIdExp = new >> ValueExpressions.IntExpression(targetTypeFieldId.getFieldIds()[0], >> ExpressionPosition.UNKNOWN); >> JFieldRef targetBuildSideFieldId = >> cg.addExpr(targetBuildFieldIdExp, >> ClassGenerator.BlkCreateMode.TRUE_IF_BOUND).getValue(); >> JBlock ifBlock = >> cg.getEvalBlock()._if(fieldIdParamHolder.getValue().eq(targe >> tBuildSideFieldId))._then(); >> >> LogicalExpression hashExpression = >> HashPrelUtil.getHashExpression(expr, seed, incomingProbe != null); >> LogicalExpression materializedExpr = >> ExpressionTreeMaterializer.materializeAndCheckErrors(hashExpression, >> batch, context.getFunctionRegistry()); >> HoldingContainer hash = cg.addExpr(materializedExpr, >> ClassGenerator.BlkCreateMode.FALSE); >> >> >> ifBlock._return(hash.getValue()); >> i++; >> } >> cg.getEvalBlock()._return(JExpr.lit(0)); >> >> } >> >> But unfortunately, the generated codes are not what I expected. The codes >> to read ValueVector , calculate hash code of the read value do not stay in >> the if block. So how can I let the related codes stay in the if block ? >> > >
