class NestedLoopJoinConverterRule extends AbstractIgniteJoinConverterRule {
    /** */
    public static final RelOptRule INSTANCE = new NestedLoopJoinConverterRule();

    /**
     * Creates a converter.
     */
    public NestedLoopJoinConverterRule() {
        super("NestedLoopJoinConverter", HintDefinition.NL_JOIN);
    }

    /** {@inheritDoc} */
    @Override protected PhysicalNode convert(RelOptPlanner planner, RelMetadataQuery mq, LogicalJoin rel) {<FILL_FUNCTION_BODY>}
}

        RelOptCluster cluster = rel.getCluster();
        RelTraitSet outTraits = cluster.traitSetOf(IgniteConvention.INSTANCE);
        RelTraitSet leftInTraits = cluster.traitSetOf(IgniteConvention.INSTANCE);
        RelTraitSet rightInTraits = cluster.traitSetOf(IgniteConvention.INSTANCE);
        RelNode left = convert(rel.getLeft(), leftInTraits);
        RelNode right = convert(rel.getRight(), rightInTraits);

        return new IgniteNestedLoopJoin(cluster, outTraits, left, right, rel.getCondition(), rel.getVariablesSet(), rel.getJoinType());
    
<methods>public final boolean matches(RelOptRuleCall) <variables>private static final non-sealed org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition[] ALL_HINTS,private static final EnumMap<org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition,org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition> HINTS,private final non-sealed org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition knownDisableHint,private final non-sealed org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition knownForceHint