โครงการมีโครงสร้างดังนี้:
สำหรับแพ็คเกจสำหรับไฟล์แหล่งที่มาของโครงการถูกจัดเรียงตามเหตุผลดังต่อไปนี้:
เพื่อผลักดันการเลือกให้อยู่ในตำแหน่งที่เหมาะสมในแผนตรรกะของเราเราได้ดำเนินการตามโครงสร้างของยูเนี่ยนค้นหาโครงสร้างข้อมูลไปยังแอตทริบิวต์กลุ่มที่มีเงื่อนไขช่วงเดียวกัน เงื่อนไขการเลือกซึ่งมี EqualSto, Greaterthan, การแสดงออกของ Minorthan ระหว่างความสัมพันธ์หนึ่งกับตัวเลขหรือระหว่างสองแอตทริบิวต์ของความสัมพันธ์เดียวกันจะถูกผลักลงหลังจากเงื่อนไขการเข้าร่วม uneqality และการเลือกที่ใช้งานได้อื่น ๆ จะถูกผลักดันขึ้นไปยังผู้ดำเนินการเข้าร่วม
เราสร้างคลาสที่เรียกว่า SelectionOptimizer เพื่อจัดการกับวิธีการเลือกที่จะใช้ ก่อนอื่นเราตรวจสอบความพร้อมใช้งานการจัดทำดัชนีสำหรับคุณลักษณะทั้งหมดของความสัมพันธ์หนึ่งที่เกี่ยวข้องในการเลือก หากไม่มีการจัดทำดัชนีที่เหมาะสมสำหรับคุณลักษณะเหล่านี้เราจะเลือกวิธีการสแกนธรรมดา หากมีตัวเลือกการจัดทำดัชนีในแอตทริบิวต์เหล่านี้เราจะเปรียบเทียบต้นทุนค่าใช้จ่ายและเลือกตัวเลือกที่มีค่าใช้จ่ายต่ำสุด
เรามีปัญหาบางอย่างเกี่ยวกับวิธีการโปรแกรมแบบไดนามิกเพื่อเลือกคำสั่งการเข้าร่วมที่ดีที่สุด โซลูชันที่ถูกบุกรุกที่เรานำไปใช้อย่างเป็นทางการคือการเลือกคำสั่งซื้อตามขนาดตารางแต่ละขนาด
ตรรกะของเราคือการใช้ Sort Merg เข้าร่วมหากใช้งานได้ หาก SMJ ไม่สามารถใช้งานได้เราเลือกที่จะใช้การเข้าร่วมบล็อกซ้อนกันบล็อก
รายการระดับบนสุด ของโปรแกรมอยู่ที่ client.sqlinterpreter.main ()
ล่ามนั้นมีค่าใช้จ่ายในการอ่านไฟล์อินพุตและถ่ายโอนไปยังตัวประเมินแบบสอบถามและในที่สุดก็ส่งออกผลลัพธ์ไปยังไฟล์
เราจัดหมวดหมู่เงื่อนไขจากประโยคที่: 1. การเปรียบเทียบระหว่างค่าคงที่ 2. เงื่อนไขการเลือกในตาราง 3. เงื่อนไขการเข้าร่วมโต๊ะข้าม
ในช่วงเริ่มต้นของการแยกวิเคราะห์เงื่อนไขทั้งหมดจะถูกสกัดโดยการแยกและการแสดงออก จากนั้นสำหรับแต่ละตารางเราบันทึก: 1) เงื่อนไขการเลือกและ 2) เงื่อนไขการเข้าร่วมกับตาราง ก่อนหน้า ทั้งหมด ด้วยวิธีนี้เราสามารถย้ายไปตามตารางจากตารางและมุ่งเน้นเฉพาะเงื่อนไขที่เกี่ยวข้องเมื่อตารางใหม่จำเป็นต้องเข้าร่วมกับต้นไม้ย่อยด้านซ้ายปัจจุบัน และแน่นอนว่ามีการจัดการเงื่อนไขคงที่ก่อนทุกอย่าง
เราใช้ Sortoperator ตามคำแนะนำ หากองค์ประกอบที่สั่งซื้อบางอย่างไม่ได้คาดการณ์ไว้ (เช่นเลือก SA จากคำสั่ง S SB) และจำเป็นต้องมีความแตกต่างเรามีผู้ให้บริการรายอื่นที่ใช้ HashSet เพื่อรักษาคำสั่งซื้อ
เราให้บริการคลาส Bplustree และตัวสร้างของมันสามารถสร้างไฟล์ดัชนีอนุกรมบนแอตทริบิวต์ perticular หนึ่งตัวจากข้อมูลความสัมพันธ์ที่กำหนด นอกจากนี้ยังมีฟังก์ชั่นดัชนี Deserialization เมื่อผู้ใช้จำเป็นต้องใช้ตัวดำเนินการสแกนดัชนีระหว่างการดำเนินการ สิ่งนี้จะทำให้เวลาในการค้นหา tuple สั้นลง
เราใช้ตัวดำเนินการสแกนดัชนีสำหรับการเลือกดัชนีโดยใช้ดัชนี B+ Tree มันประเมินนิพจน์ประกอบด้วยแอตทริบิวต์ดัชนีและจะเรียก Deserilizer เพื่อดึงข้อมูลการป้อนข้อมูลที่อิ่มตัวครั้งแรกจากโหนดใบของต้นไม้ B+ หลังจากนั้นมันจะดึง Tuples เป็นเส้นตรงหากไฟล์เป็นกลุ่มอย่างชาญฉลาดอื่น ๆ มันจะดึงข้อมูลการป้อนข้อมูลที่พึงพอใจต่อไปอย่างต่อเนื่องจาก deserializer
ในการออกแบบก่อนหน้าของเราเราให้ข้อ จำกัด ที่สำคัญของผู้ประกอบการที่สำคัญว่าลูกของผู้ให้บริการการเลือกเชิงตรรกะจะต้องเป็นตัวดำเนินการสแกน ดังนั้นเมื่อเราใช้รูปแบบของผู้เข้าชมเพื่อสร้างแผนทางกายภาพของเราเราจะต้องข้ามไปยังผู้ประกอบการที่เลือกได้มากที่สุด และเมื่อผู้เข้าชมเดินทางไปยังผู้ให้บริการที่เลือกตรรกะสามารถตัดสินใจได้ว่าลูกของผู้ประกอบการที่เลือกควรเป็นผู้ให้บริการสแกนหรือผู้ดำเนินการสแกนดัชนีเต็มรูปแบบ
ในขณะที่เราเก็บข้อมูลจากไฟล์การกำหนดค่าไว้ในแคตตาล็อก ประการแรกหากแคตตาล็อกฐานข้อมูลแสดงให้เห็นว่าการค้นหาดัชนีเปิดอยู่เราควรตรวจสอบความพร้อมใช้งานของดัชนีในแบบสอบถามนี้
เรามีวิธีการที่เรียกว่า HasIdxattr ซึ่งตรวจสอบว่าดัชนีใช้กับเงื่อนไขการเลือกหรือไม่ นั่นคือถ้าเงื่อนไขการเลือกสำหรับตารางนี้มีค่า มากกว่า มากกว่าเท่ากับ เท่ากับ น้อยกว่าน้อย กว่าเท่ากับ ในแอตท3ที่จัดทำดัชนีแล้วเราก็ดีที่จะสร้าง ตัวดำเนินการสแกนดัชนี เป็นเด็ก จากนั้นเราคำนวณ Lowkey และ Highkey ขึ้นอยู่กับการเลือกทั้งหมดจากนั้นสร้างตัวดำเนินการ
หาก HasIdxAttr ส่งคืนเท็จเราควรสร้างตัวดำเนินการสแกนแบบเต็มปกติ
ในที่สุดเรากลับไปที่ระดับ Uppper
เราใช้ประโยชน์จากกลยุทธ์การทดสอบสองแบบ
สำหรับการทดสอบขั้นพื้นฐานเราสร้างตัวดำเนินการด้วยตนเองและทิ้ง Tuples เพื่อพิสูจน์ว่าผู้ปฏิบัติงานสามารถทำงานได้โดยคำนึงถึงโมเดลตัววนซ้ำ
การทดสอบแบบ end-to-end คือการทดสอบที่ใช้ล่ามทั้งหมดเป็นหน่วยภายใต้การทดสอบ กรณีทดสอบจะใช้ไฟล์แบบสอบถามอินพุตจากนั้นเรียกใช้การสืบค้นในที่สุดก็พิมพ์ผลลัพธ์ลงในไฟล์เป้าหมาย
เพื่อให้การทดสอบดีขึ้นเราได้เขียนสคริปต์ทุบตีซึ่งทิ้งผลลัพธ์ของฐานข้อมูล MySQL เป็นเอาต์พุตที่คาดหวัง ดังนั้นจึงเป็นเรื่องง่ายมากที่เราจะสร้างกรณีทดสอบที่ค่อนข้างซับซ้อน
นอกจากนี้เราได้สร้าง UTIL Class Diff เพื่อเปรียบเทียบสองไฟล์ซึ่งจะตัดสินความถูกต้องของเอาต์พุตโดยอัตโนมัติ