private void createCopier( VectorAccessible batch, List<BatchGroup> batchGroupList, VectorContainer outputContainer, boolean spilling) throws SchemaChangeException { try { if (copier == null) { CodeGenerator<PriorityQueueCopier> cg = CodeGenerator.get( PriorityQueueCopier.TEMPLATE_DEFINITION, context.getFunctionRegistry(), context.getOptions()); ClassGenerator<PriorityQueueCopier> g = cg.getRoot(); generateComparisons(g, batch); g.setMappingSet(COPIER_MAPPING_SET); CopyUtil.generateCopies(g, batch, true); g.setMappingSet(MAIN_MAPPING); copier = context.getImplementationClass(cg); } else { copier.close(); } BufferAllocator allocator = spilling ? copierAllocator : oAllocator; for (VectorWrapper<?> i : batch) { ValueVector v = TypeHelper.getNewVector(i.getField(), allocator); outputContainer.add(v); } copier.setup(context, allocator, batch, batchGroupList, outputContainer); } catch (ClassTransformationException | IOException e) { throw new RuntimeException(e); } }
@Override public void close() { try { if (batchGroups != null) { closeBatchGroups(batchGroups); batchGroups = null; } if (spilledBatchGroups != null) { closeBatchGroups(spilledBatchGroups); spilledBatchGroups = null; } } finally { if (builder != null) { builder.clear(); builder.close(); } if (sv4 != null) { sv4.clear(); } try { if (copier != null) { copier.close(); } } catch (IOException e) { throw new RuntimeException(e); } finally { copierAllocator.close(); super.close(); if (mSorter != null) { mSorter.clear(); } for (Iterator iter = this.currSpillDirs.iterator(); iter.hasNext(); iter.remove()) { Path path = (Path) iter.next(); try { if (fs != null && path != null && fs.exists(path)) { if (fs.delete(path, true)) { fs.cancelDeleteOnExit(path); } } } catch (IOException e) { // since this is meant to be used in a batches's cleanup, we don't propagate the // exception logger.warn("Unable to delete spill directory " + path, e); } } } } }