presto-main/src/main/java/io/prestosql/operator/LookupJoinOperator.java/JoinProcessor/JoinProcessor
class JoinProcessor:        public JoinProcessor(
                List<Type> probeTypes,
                List<Type> buildOutputTypes,
                JoinType joinType,
                LookupSourceFactory lookupSourceFactory,
                JoinProbeFactory joinProbeFactory,
                Runnable afterClose,
                OptionalInt lookupJoinsCount,
                HashGenerator hashGenerator,
                PartitioningSpillerFactory partitioningSpillerFactory,
                JoinStatisticsCounter statisticsCounter,
                DriverYieldSignal yieldSignal,
                SpillContext spillContext,
                MemoryTrackingContext memoryTrackingContext)
        {
            this.probeTypes = ImmutableList.copyOf(requireNonNull(probeTypes, "probeTypes is null"));

            requireNonNull(joinType, "joinType is null");
            // Cannot use switch case here, because javac will synthesize an inner class and cause IllegalAccessError
            probeOnOuterSide = joinType == PROBE_OUTER || joinType == FULL_OUTER;

            this.joinProbeFactory = requireNonNull(joinProbeFactory, "joinProbeFactory is null");
            this.afterClose = requireNonNull(afterClose, "afterClose is null");
            this.lookupJoinsCount = requireNonNull(lookupJoinsCount, "lookupJoinsCount is null");
            this.hashGenerator = requireNonNull(hashGenerator, "hashGenerator is null");
            this.lookupSourceFactory = requireNonNull(lookupSourceFactory, "lookupSourceFactory is null");
            this.partitioningSpillerFactory = requireNonNull(partitioningSpillerFactory, "partitioningSpillerFactory is null");
            this.lookupSourceProviderFuture = lookupSourceFactory.createLookupSourceProvider();

            this.statisticsCounter = statisticsCounter;

            this.pageBuilder = new LookupJoinPageBuilder(buildOutputTypes);
            this.yieldSignal = requireNonNull(yieldSignal, "yieldSignal is null");
            this.spillContext = requireNonNull(spillContext, "spillContext is null");
            this.memoryTrackingContext = requireNonNull(memoryTrackingContext, "memoryTrackingContext is null");
        }