Thiết kế và cài đặt chƣơng trình

Một phần của tài liệu TỐi ưu HÓA TRUY VẤN CƠ SỞ DỮ LIỆU Hướng ĐỐI TưỢNG (Trang 62)

Chƣơng trình đƣợc viết trên ngôn ngữ lập trình C#. Dựa trên những hỗ trợ về đối tƣợng của ngôn ngữ nhƣ các lớp, các thuộc tính phức, các hàm, các đối tƣợng, sự kế thừa. Các thao tác trong chƣơng trình cũng nhƣ các truy vấn đƣợc xây dựng trên

cơ sở các phép toán về đối tƣợng: Khởi tạo siêu đồ thị không lồng; khởi tạo siêu đồ thị lồng; Kiểm tra siêu đồ thị là duy nhất (chỉ có duy nhất siêu cạnh đối tƣợng); Kiểm tra siêu đồ thị có tách biệt (các siêu cạnh tạo nên siêu đồ thị không giao nhau); Kiểm tra siêu cạnh là siêu cạnh điều kiện hay không? Nếu là siêu cạnh điều kiện thì thiết lập phép toán ƣu tiên chọn siêu cạnh điều kiện nào trƣớc để loại. Ngƣợc lại, là siêu cạnh đối tƣợng thì thiết lập phép toán ƣu tiên chọn siêu cạnh đối tƣợng. Và thuật toán tinh chỉnh chƣơng trình sẽ làm cho số các bƣớc thực hiện giảm và tối ƣu hơn.

Đầu vào của chƣơng trình là các xâu dữ liệu có đƣợc từ khối SFW. Siêu đồ thị đƣợc xây dựng dựa trên các lớp, các thuộc tính và các biểu thức mà các thuộc tính tham gia. Từ mệnh đề Select ta thiết lập R là điều kiện của truy vấn. Mệnh đề From xác định các lớp trong lƣợc đồ dữ liệu của siêu đồ thị. Từ mệnh đề Where chúng ta có đƣợc mối quan hệ giữa các lớp tham gia trong siêu đồ thị.

Đầu ra của chƣơng trình là danh sách các bƣớc thực hiện tham chiếu của câu truy vấn. Tổng chi phí cho các phép nối, tích Đề các, phép giao, phép chiếu, chọn là kết quả chúng ta cần tối ƣu.

Thuật toán khởi tạo siêu đồ thị

privatevoid btnKhoitaoDoThi_Click(object sender, EventArgs e) {

ArrayList sieu_canh_doi_tuong = newArrayList(); ArrayList sieu_canh_dinh = new ArrayList();

ArrayList SC = newArrayList(); // Tap cac sieu canh doi tuong

string[] tapcacdoituong = txtFrom.Text.Split(','); // tap cac dac trung

string[] tapcacdactrung = txtSelect.Text.Split(','); for (int i = 0; i < tapcacdoituong.Length; i++) {

string item = tapcacdoituong[i].Trim(); ArrayList _e = newArrayList();

string[] doituong = item.Split(' '); //int flag = 0;

// lop doi tuong goc

if (item == "NhanSu ns" || item == "PhongBan p"

|| item == "DuAn da") {

// lay tat ca cac thuoc tinh cua doi tuong if (doituong[0] == "NhanSu")

{

_e = ThuocTinhNhanSu(); }

else if (doituong[0] == "PhongBan") {

_e = ThuocTinhPhongBan(); }

else if (doituong[0] == "DuAn") {

_e = ThuocTinhDuAn(); }

}

// la lop ke thua don va lop ke thua boi

else

{

// xu ly xuong dot ve cac thuoc tinh ke thua

if (doituong[0] == "NhanVien") {

_e = ThuocTinhNhanVien(); }

else if (doituong[0] == "QuanLy") {

_e = Thuoctinh_quanLy(); }

}

// xu ly thuoc tinh trung

//flag = 1;

//SC := SC ∪ e

sieu_canh_doi_tuong.AddRange(_e); //SC.AddRange(_e);

}

// sieu canh dinh

string[] _h = txtSelect.Text.Split(','); string chuoi1 = "";

for (int i = 0; i < _h.Length; i++) {

if (i == _h.Length - 1) { chuoi1 += item1; } else { chuoi1 += item1 +","; } }

string chuoisieucanhdinh = chuoi1; //sieu_canh_dinh.AddRange(chuoi1);

//lay tat ca cac thuoc tinh

ArrayList sieu_canh_dieu_kien = newArrayList(); ArrayList _SD = newArrayList();

int is_and = txtWhere.Text.IndexOf("&&"); string[] _p = Regex.Split(txtWhere.Text, "&&"); for (int i = 0; i < _p.Length; i++)

{

ArrayList _F = newArrayList(); string item = _p[i];

// check xem thuoc dang 3.3, 3.4

if (check_value(item)) { //_F.Add(item); _SD.Add(item); } else { _SD.Add(item); } } sieu_canh_dieu_kien.AddRange(_SD); //SC.AddRange(_SD);

string test = "Siêu cạnh đối tƣợng : "; foreach (string it in sieu_canh_doi_tuong) {

}

test += Environment.NewLine + "Siêu cạnh đỉnh : " + chuoisieucanhdinh; string test1 = "";

foreach (string it in sieu_canh_dieu_kien) {

test1 += it + ","; }

test += Environment.NewLine + "Siêu điều kiện : " + test1; textBox1.Text = test;

//MessageBox.Show(test);

}

// p.LuongCB > 3,000,000

publicbool check_value(string value) {

try

{

bool check = false;

string[] var = { "<", "<=","<>",">",">="}; for (int i = 0; i < var.Length; i++)

{ if (value.Contains(var[i])) { returntrue; } } return check; } catch { returnfalse; } }

Thuật toán ƣớc lƣợng siêu cạnh

publicArrayList UocLuong_SieuCanh(ArrayList lop_dan_suat_E, string su_kien) {

ArrayList lop_dan_suat = newArrayList(); int so_doi_tuong = lop_dan_suat_E.Count;

if (so_doi_tuong == 1) // 1 doi tuong

{

lop_dan_suat = lop_dan_suat_E; }

else // n doi tuong

{

string[] dulieu = su_kien.Split(',');

if (dulieu[1] == "1" || dulieu[1] == "3") // dinh dang kieu doi tuong

{

string[] doituong = dulieu[0].Split('.'); lop_dan_suat_E.Remove(doituong[1]); //

lop_dan_suat = lop_dan_suat_E; //

}

elseif (dulieu[1] == "2") {

// co doi tuong giao nhau giua 2 doi tuong

string[] doituong = dulieu[1].Split('='); // thuoc tinh se loai bo

string[] thuoctinh = doituong[0].Split('.');

lop_dan_suat_E.Remove(thuoctinh[1]); // lop_dan_suat = lop_dan_suat_E; // } } return lop_dan_suat; }

publicint kiemtra_sieudieukien(string value) { try { // (A==b)n.A = b or n.A == m.B if (value.Contains("==")) { string[] str = value.Split('.');

//n.A == b thuoc dang 3.1 thuoc dang dieu kien gan nhan

if (str.Count() < 2) {

return 1; }

// n.A == m.B thuoc dang 3.2 thuoc dang dieu kien ket hop giua cac bang

else

{

return 2; }

}

// thuoc dang 3.3 hoac dang 3.4

else

{

string[] var1 = { "<", "<=", "<>", ">", ">=" }; for (int i = 0; i < var1.Length; i++)

{ if (value.Contains(var1[i])) { return 3; } }

// sieu canh ket hop co cac luong tu nhu sau

// IS, IN, UNION, FORALL, EXIST

string[] var2 = { "IS", "IN", "UNION", "FORALL", "EXIST" }; for (int i = 0; i < var2.Length; i++)

{ if (value.Contains(var2[i])) { return 4; } } return -1; } } catch { return -1; } }

Một phần của tài liệu TỐi ưu HÓA TRUY VẤN CƠ SỞ DỮ LIỆU Hướng ĐỐI TưỢNG (Trang 62)

Tải bản đầy đủ (PDF)

(80 trang)