Разработка языка запросов в бинарной модели знаний и транслятора этого языка в язык SQL (бакалаврская работа) (544460), страница 11
Текст из файла (страница 11)
C_Department.AddSimpleAttribute("Заведующий", "string");
C_Department.AddSimpleAttribute("Факультет", "string");
C_Discipline.AddSimpleAttribute("Назв", "string");
C_Discipline.AddSimpleAttribute("HourNumber", "int");
C_Discipline.AddSimpleAttribute("Type", "string");
L_works_on.AddSimpleAttribute("ДатаПоступления", "date");
L_passed_exam.AddSimpleAttribute("Дата", "date");
L_passed_exam.AddSimpleAttribute("Оценка", "int");
L_passed_exam.AddClassAttribute("Кому",C_Teacher);
StudiesScheme = new OnthologyScheme("Учебный процесс",
C_Student, C_Teacher, C_Group, C_Department, C_Discipline,
L_works_on, L_passed_exam);
currentScheme = StudiesScheme;
}
4.3. Использование транслятора в программном коде.
Для использования транслятора в программном коде, необходимо подключить файл Translator.cs, в котором находятся классы Translator и TranslatorException, реализующие соответственно транслятор и исключение с сообщением об ошибке, возникающее в ходе трансляции.
В программе нужно создать экземпляр транслятора, используя ранее определенную схему, и вызвать функцию translate, аргументом которой является запрос на языке БМЗ, результатом будет запрос на SQL.
Пример:
Translator t = new Translator(currentScheme);
string SQLQuery = t.translate(QLQuery);
Здесь currentScheme – схема, QLQuery – запрос на языке БМЗ, SQLQuery – запрос на SQL.
4.4. Программа с подключенной базой данных.
Ниже представлен пример программы, с подключенной базой данных, где используется транслятор запросов.
Внешний вид, в основном, совпадает с программой, представленной на Рис 3.1. При нажатии на кнопку «Перевести», кроме трансляции, выполяняется вывод результатов выполнения. В нижней части программы выводится результат запроса на SQL (Рис 4.4), либо одна из таблиц из базы данных (Рис 4.5).
Рис 4.4
Рис 4.5
ПРИЛОЖЕНИЕ
Сообщения об ошибке в запросе:
Запрос пуст
В начале запроса должен стоять вопросительный знак
Отсутствует знак '-'
Нельзя использовать символы "__” в начале слова
Отсутствует целевая переменная(выражение перед знаком '-'
Отсутствуют условия (выражения после знака '-')
Лишняя запятая после первой цели запроса <ЦЕЛЕВАЯ ЧАСТЬ>
Лишняя запятая после цели <ЦЕЛЬ>
Незакрытая скобка в цели запроса <ЦЕЛЬ>
Неизвестная функция <АГРЕГАТНАЯ ФУНКЦИЯ> в цели запроса <ЦЕЛЬ>
Лишняя открывающая скобка на <ПОЗИЦИЯ> символе
Конъюнктивное выражение под номером <НОМЕР> пусто
Последнее конъюнктивное выражение пусто (возможно лишний символ ";"
При использовании ключевого слова "IN" скобка должна стоять после имени класса
Пустое выражение внутри скобок в выражении <ВЫРАЖЕНИЕ>
Неверно выражение <ВЫРАЖЕНИЕ>. Отношение должно состоять из 4 слов:(X RelationName L Y) или из 3: (X RelationName Y)
Переменная отношения <ИМЯ ПЕРЕМЕННОЙ> относится к неизвестному отношению <ИМЯ ОТНОШЕНИЯ>
В выражении <ВЫРАЖЕНИЕ> несколько операторов
В выражении <ВЫРАЖЕНИЕ> отсутствуют операторы
Ошибка записи в выражении <ВЫРАЖЕНИЕ>. В атрибутах, где используются суррогаты можно использовать только оператор "="
Переменная <ИМЯ ПЕРЕМЕННОЙ> относится к классу <КЛАСС ПЕРЕМЕННОЙ> но в этом классе не содержится атрибут <ИМЯ АТРИБУТА>
Переменная <ИМЯ ПЕРЕМЕННОЙ> неизвестного типа
Не задана целевая переменая
Переменная <ИМЯ ПЕРЕМЕННОЙ> имеет неопределенный в схеме класс <КЛАСС ПЕРЕМЕННОЙ>
Неоднозначный тип у переменной <ИМЯ ПЕРЕМЕННОЙ>. Возможные значения типов: <КЛАСС1 ПЕРЕМЕННОЙ>, <КЛАСС2 ПЕРЕМЕННОЙ>
Код программы
Файл Onthology.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Запросы
{
class OnthologyScheme
{
public string Name;
public List<OnthologyClass> Classes;
public List<OnthologyRelation> Relations;
public OnthologyScheme(string name, params OnthologyClass[] classes)
{
Name = name;
Classes = new List<OnthologyClass>();
Relations = new List<OnthologyRelation>();
foreach (OnthologyClass oc in classes)
{
if (oc is OnthologyRelation)
Relations.Add(oc as OnthologyRelation);
else
Classes.Add(oc);
}
}
}
class OnthologyClass
{
public string Name;
public List<OnthologyAttribute<string>> SimpleAttributes;
public List<OnthologyAttribute<OnthologyClass>> ClassAttributes;
public OnthologyClass(string name)
{
Name = name;
SimpleAttributes = new List<OnthologyAttribute<string>>();
ClassAttributes = new List<OnthologyAttribute<OnthologyClass>>();
}
public bool isSimpleAttribute(string attrName)
{
foreach (OnthologyAttribute<string> attr in SimpleAttributes)
{
if (attrName.ToUpper() == attr.Name.ToUpper())
return true;
}
return false;
}
virtual public bool isClassAttribute(string attrName)
{
foreach (OnthologyAttribute<OnthologyClass> attr in ClassAttributes)
{
if (attrName.ToUpper() == attr.Name.ToUpper())
return true;
}
return false;
}
public void AddSimpleAttribute(string name,string type)
{
SimpleAttributes.Add(new OnthologyAttribute<string>{Name = name, Type = type});
}
public void AddClassAttribute(string name, OnthologyClass oc)
{
ClassAttributes.Add(new OnthologyAttribute<OnthologyClass> { Name = name, Type = oc });
}
}
class OnthologyAttribute<T>
{
public string Name;
public T Type;
}
class OnthologyRelation : OnthologyClass
{
public OnthologyRelation(string name,OnthologyClass left,OnthologyClass right) : base(name)
{
Left = left;
Right = right;
}
public OnthologyClass Left;
public OnthologyClass Right;
override public bool isClassAttribute(string attrName)
{
return (base.isClassAttribute(attrName) ||
attrName.ToUpper() == Left.Name.ToUpper() ||
attrName.ToUpper() == Right.Name.ToUpper());
}
}
}
Файл Translator.cs
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Запросы
{
class TranslatorException : Exception
{
public TranslatorException() { }
public TranslatorException(string message) : base(message) { }
public TranslatorException(string message, Exception inner) : base(message, inner) { }
}
/// <summary>
/// Транслирует язык запросов на язык SQL
/// </summary>
class Translator
{
/// <summary>
/// Класс, описывающий переменную, ее тип и известные значения.
/// </summary>
class QueryVariable
{
static public OnthologyScheme scheme;
string name;
OnthologyClass oclass;
List<string> neededAttributes;
List<string> complexAttributes;
List<string> simpleAttributes;
List<string> simpleAttributeOperators;
List<string> simpleAttributeValues;
List<string> classAttributes;
List<QueryVariable> classVariables;
public QueryVariable(string _name, string className)
: this(_name)
{
AddClass(className);
}
public QueryVariable(QueryVariable parentVar, string _name, string className)
: this(_name)
{
AddClassOnAttribute(parentVar, className);
}
public QueryVariable(string _name)
{
name = _name;
oclass = null;
simpleAttributes = new List<string>();
neededAttributes = new List<string>();
simpleAttributeValues = new List<string>();
simpleAttributeOperators = new List<string>();
complexAttributes = new List<string>();
classAttributes = new List<string>();
classVariables = new List<QueryVariable>();
}
public void AddClass(string className)
{
OnthologyClass oc = scheme.Classes.Find(c => c.Name == className);
if (oc == null)
oc = scheme.Relations.Find(c => c.Name == className);
if (oc == null)
throw new TranslatorException("Переменная " + Name + " имеет неопределенный в схеме класс: " + className);
if (oclass != null && oclass != oc)
throw new TranslatorException("Неоднозначный тип у переменной " + Name + ". Возможные значения типов:" + className + "," + oclass.Name);
oclass = oc;
}
public void AddClassOnAttribute(QueryVariable parentVar, string attributeClassName)
{
if (parentVar.Class is OnthologyRelation)
{
OnthologyRelation ontRel = (OnthologyRelation)parentVar.Class;
if (ontRel.Left.Name.ToUpper() == attributeClassName.ToUpper())
oclass = ontRel.Left;
if (ontRel.Right.Name.ToUpper() == attributeClassName.ToUpper())
oclass = ontRel.Right;
}
else
{
oclass = parentVar.Class.ClassAttributes.Find(c => c.Name.ToUpper() == attributeClassName.ToUpper()).Type;
}
}
public void AddNeededAttribute(string attr)
{
neededAttributes.Add(attr);
}
public void AddComplexAttribute(string attr)
{
complexAttributes.Add(attr);
}
public void AddSimpleAttribute(string attr, string attrOperator, string value)
{
simpleAttributes.Add(attr);
simpleAttributeOperators.Add(attrOperator);
simpleAttributeValues.Add(value);
}
public void AddClassAttribute(string attr, QueryVariable qv)
{
classAttributes.Add(attr);
classVariables.Add(qv);
}
public void DefineClass()
{
if (oclass == null)
for (int i = 0; i < scheme.Classes.Count; i++)
{
OnthologyClass oc = scheme.Classes[i];
if (attrIsInColumns(oc, neededAttributes) && attrIsInColumns(oc, simpleAttributes))
{
oclass = oc;
return;
}
}
}
bool attrIsInColumns(OnthologyClass Class, List<string> QueryAttributes)
{
bool allAttrsInTable = true;
foreach (string queryAttrName in QueryAttributes)
{
bool attrIsInColumns = false;
foreach (OnthologyAttribute<string> classAttr in Class.SimpleAttributes)
{
if (queryAttrName == classAttr.Name)
{
attrIsInColumns = true;
break;
}
}
if (!attrIsInColumns)
{
allAttrsInTable = false;
break;
}
}
return allAttrsInTable;
}
public string Name
{
get
{
return name;
}
}
public OnthologyClass Class
{
get















