class AbstractSqlHasCreateJoin {

    private final DbmsHandlerComponent dbmsHandlerComponent;
    private final Project project;
    private final SqlAdapterMapper sqlAdapterMapper;
    private final boolean allowStreamIteratorAndSpliterator;

    AbstractSqlHasCreateJoin(
        final DbmsHandlerComponent dbmsHandlerComponent,
        final Project project,
        final SqlAdapterMapper sqlAdapterMapper,
        final boolean allowStreamIteratorAndSpliterator
    ) {
        this.dbmsHandlerComponent = requireNonNull(dbmsHandlerComponent);
        this.project = requireNonNull(project);
        this.sqlAdapterMapper = requireNonNull(sqlAdapterMapper);
        this.allowStreamIteratorAndSpliterator = allowStreamIteratorAndSpliterator;
    }

    <T> SqlFunction<ResultSet, T> rsMapper(
        final List<Stage<?>> stages,
        final int stageIndex,
        final TableIdentifier<T> identifier
    ) {
        return resultSetMapper(project, identifier, stages, stageIndex, sqlAdapterMapper);
    }

    <T> Join<T> newJoin(final List<Stage<?>> stages, final SqlFunction<ResultSet, T> rsMapper) {<FILL_FUNCTION_BODY>}

}

        requireNonNull(stages);
        requireNonNull(rsMapper);
        return new JoinImpl<>(
            () -> JoinSqlUtil.stream(dbmsHandlerComponent, project, stages, rsMapper, allowStreamIteratorAndSpliterator)
        );
    
<no_super_class>