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; } }