Proyek ini disusun sebagai berikut:
Untuk paket untuk file sumber proyek diatur oleh rasional berikut:
Untuk mendorong seleksi ke posisi yang tepat dalam rencana logis kami, kami mengimplementasikan struktur data yang menemukan Union untuk mengelompokkan atribut dengan kondisi rentang yang sama. Kondisi seleksi, yang berisi EqualSto, GreaterThan, Minorthan Ekspresi antara satu hubungan dan angka atau antara dua atribut dari hubungan yang sama akan didorong ke bawah setelah kondisi gabungan. Kondsi seleksi yang dapat digunakan lainnya akan didorong ke operator gabungan.
Kami membuat kelas yang disebut selectionOptimizer untuk menangani metode seleksi mana yang akan digunakan. Kami pertama -tama memeriksa ketersediaan pengindeksan untuk semua atribut dari satu hubungan yang terlibat dalam seleksi. Jika tidak ada pengindeksan yang tepat untuk atribut ini, kami akan memilih metode pemindaian biasa. Jika ada opsi pengindeksan pada atribut ini, kami akan membandingkan biaya biaya mereka, dan memilih yang dengan biaya terendah.
Kami memiliki beberapa masalah yang memohon metode pemrograman dinamis untuk memilih pesanan gabungan terbaik. Solusi yang dikompromikan yang kami terapkan dengan cepat adalah memilih pesanan gabungan berdasarkan setiap ukuran tabel.
Logika kami adalah menggunakan Sort MERG bergabung jika berlaku. Jika SMJ tidak berlaku, kami memilih untuk menggunakan Block Nested Loop Join.
Entri tingkat atas dari program ini ada di klien.sqlinterpreter.main ().
Interpreter bertanggung jawab untuk membaca file input dan mentransfer ke evalutator kueri, dan akhirnya mengeluarkan hasilnya ke file.
Kami mengkategorikan kondisi dari klausa di mana: 1. Perbandingan antara konstanta. 2. Kondisi Pilih In-Table. 3. Kondisi gabungan silang.
Pada awal penguraian, semua kondisi diekstraksi dengan secara rekursif memecah dan ekspresi. Kemudian untuk setiap tabel kami merekam: 1) Kondisi pilihnya, dan 2) kondisi gabungannya dengan semua tabel sebelumnya . Dengan cara ini, kita bisa bergerak di sepanjang tabel dari tabel, dan hanya fokus pada kondisi yang relevan ketika tabel baru perlu bergabung dengan sub-pohon kiri saat ini. Dan tentu saja, kondisi konstan ditangani sebelum segalanya.
Kami menerapkan sortoperator sesuai instruksi. Jika elemen -elemen yang dipesan tertentu tidak diproyeksikan (misalnya, pilih Sa dari S Order oleh SB) dan diperlukan berbeda, kami memiliki operator lain menggunakan HashSet untuk mempertahankan pesanan.
Kami menyediakan kelas Bplustree, dan konstruktornya dapat membangun file indeks serial pada satu atribut pertikular dari data hubungan yang diberikan. Ini juga menyediakan fungsionalitas deserialisasi indeks pohon ketika pengguna perlu menggunakan operator pemindaian indeks selama eksekusi. Ini akan memperpendek waktu pencarian tuple.
Kami mengimplementasikan operator pemindaian indeks untuk pemilihan indeks menggunakan indeks pohon B+. Ia mengevaluasi ekspresi berisi atribut indeks, dan akan memanggil deserilizer untuk mengambil entri data yang dipenuhi pertama dari simpul daun pohon B+. Setelah itu, itu akan mengambil tupel secara linear jika file dikelompokkan, bijaksana lainnya, itu akan terus mengambil entri data yang puas berikutnya dari deserializer.
Dalam desain kami sebelumnya, kami memberi operator seleksi logis kami batasan yang penting bahwa anak dari operator seleksi logis harus menjadi operator pemindaian. Oleh karena itu, ketika kita menggunakan pola pengunjung untuk membangun rencana fisik kita, kita hanya perlu melintasi ke operator seleksi paling banyak. Dan ketika pengunjung melintasi operator seleksi, logika dapat memutuskan bahwa anak dari operator seleksi harus operator pemindaian penuh atau operator pemindaian indeks.
Karena kami telah menyimpan informasi dari file konfigurasi ke katalog. Pertama, jika katalog basis data menunjukkan bahwa kueri indeks aktif, kita harus memeriksa ketersediaan indeks pada kueri ini.
Kami memiliki metode yang disebut HasIdxAttr yang memeriksa apakah indeks berlaku untuk kondisi pemilihan. Artinya, jika kondisi seleksi untuk tabel ini lebih besar dari , lebih besar dari sama dengan , sama , kurang dari , kurang dari sama dengan pada atraibible yang diindeks, maka kami baik untuk membangun operator pemindaian indeks sebagai anak. Kemudian kami menghitung lowkey dan highkey bergantung pada semua kondisi seleksi dan kemudian membangun operator.
Jika HasIdxAttr mengembalikan false, kita harus membangun operator pemindaian penuh normal.
Akhirnya kami kembali ke tingkat Uppper.
Kami menggunakan dua strategi pengujian
Untuk tes dasar, kami secara manual membangun operator dan membuang tupel untuk membuktikan bahwa operator dapat bekerja sehubungan dengan model iterator.
Tes ujung-ke-ujung adalah tes yang mengambil seluruh penerjemah sebagai unit yang sedang diuji. Kasing uji akan mengambil file kueri input dan kemudian menjalankan kueri, akhirnya mencetak hasilnya ke file target.
Untuk melakukan pengujian dengan lebih baik, kami telah menulis skrip bash yang membuang hasil dari database MySQL sebagai output yang diharapkan. Oleh karena itu, sangat mudah bagi kami untuk membangun kasus uji yang relatif kompleks.
Juga, kami telah membuat diff kelas util untuk membandingkan dua file yang secara otomatis akan menilai kebenaran output.