import java.util.List;

public class SimulasiNPlusSatu {

    static int jumlahQuery = 0;

    record Penulis(long id, String nama) { }

    private static final List<Penulis> PENULIS = List.of(
            new Penulis(1, "Dee Lestari"),
            new Penulis(2, "Tere Liye"),
            new Penulis(3, "Andrea Hirata"));

    public static void main(String[] args) {
        System.out.println("== pendekatan naif: satu query penulis + N query relasi ==");
        jumlahQuery = 0;
        query("SELECT id, nama FROM penulis");
        for (Penulis p : PENULIS) {
            query("SELECT id, judul FROM buku WHERE penulis_id = " + p.id());
        }
        System.out.println("total query: " + jumlahQuery + " (1 + N)");

        System.out.println();
        System.out.println("== pendekatan JOIN FETCH: relasi ikut query pertama ==");
        jumlahQuery = 0;
        query("SELECT p.id, p.nama, b.id, b.judul FROM penulis p "
                + "LEFT JOIN buku b ON b.penulis_id = p.id");
        System.out.println("total query: " + jumlahQuery);

        System.out.println();
        System.out.println("== pendekatan batch: kumpulkan id lalu IN () ==");
        jumlahQuery = 0;
        query("SELECT id, nama FROM penulis");
        query("SELECT id, judul, penulis_id FROM buku WHERE penulis_id IN (1, 2, 3)");
        System.out.println("total query: " + jumlahQuery);
    }

    static void query(String sql) {
        jumlahQuery++;
        System.out.println("  query #" + jumlahQuery + ": " + sql);
    }
}
