Map
Changes
ModelData/BusinessModel/MainEntities/Settlement.cs 113(+110 -3)
ModelData/BusinessModel/RDF/Queries.cs 252(+231 -21)
ModelData/BusinessModel/RDF/RDFQuery.cs 50(+43 -7)
ModelData/BusinessModel/Tools/Coordinate.cs 92(+83 -9)
ModelData/BusinessModel/Tools/InstantTime.cs 90(+90 -0)
ModelData/BusinessModel/Tools/Period.cs 37(+37 -0)
Tools/Main/Extensions.cs 115(+115 -0)
Tools/Main/SerializeService.cs 48(+27 -21)
Tools/Tools.csproj 1(+1 -0)
web-map/Controllers/HomeController.cs 14(+7 -7)
Details
diff --git a/ModelData/BusinessModel/BaseAndInterface/BaseOntologyEntity.cs b/ModelData/BusinessModel/BaseAndInterface/BaseOntologyEntity.cs
index 0968529..32d7b7b 100644
--- a/ModelData/BusinessModel/BaseAndInterface/BaseOntologyEntity.cs
+++ b/ModelData/BusinessModel/BaseAndInterface/BaseOntologyEntity.cs
@@ -8,54 +8,67 @@ using Tools;
namespace ModelData.BusinessModel.BaseAndInterface
{
-
/*!
- \brief Родительский класс, не несущий никакой смысловой нагрузки
+ \defgroup Entities Сущности
+ \brief Группа классов всех сущностей
- Данный класс имеет только одну простую цель: проиллюстрировать то,
- как Doxygen документирует наследование
- */
+ Включает в себя такие сущности: BaseOntologyEntity,
+ @{
+ */
/// \class BaseOntologyEntity
///
- /// \brief A base ontology entity. - краткое описание
- /// полное описание
- /// \author Deniska
+ /// \brief Базовый класс онтологической сущности.
+ /// Данный класс описывает сущность, обладающую уникальным идентификатором (URL) и собственным названием (Title).
+ /// Данные параметры наследованы от интерфейса I_URL.
+ /// \author Denis
/// \date 30.03.2019
- ///
- ///
- /// \authors
- /// \version
- /// \date
- /// \bug
- /// \warning
- /// \todo
public abstract class BaseOntologyEntity : I_URLcs, I_MySerializable
{
+ /// \property public string URL
+ ///
+ /// \brief Уникальный идентификатор сущности.
+ /// Установлен атрибут IndexAttrib со значением 0, т.е. данное свойство будет выводится первым при записи в поток.
+ /// \returns The URL.
+
[IndexAttrib(0)] public string URL { set; get; }
+
+
+
+ /// \property public string Title
+ ///
+ /// \brief Наименование сущности.
+ /// Установлен атрибут IndexAttrib со значением 1.
+ /// \returns The title.
+
[IndexAttrib(1)] public string Title { set; get; }
+
+
+
+ /// \fn public abstract Dictionary<string, string> Serialize();
+ ///
+ /// \brief Метод, помещающий все необходимые сведения об объекте в Dictionary для последущей записи в поток.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public abstract Dictionary<string, string> Serialize();
+
+
/// \fn protected string Concat(List<string> l)
///
- /// \brief Concatenates the given l
+ /// \brief Объединяет непустые строки из списка в одну.
///
- /// \author Deniska
+ /// \author Denis
/// \date 30.03.2019
///
/// \param l A List<string> to process.
///
/// \returns A string.
- ///
- ///
- /// \param [<направление>] <имя_параметра> {описание_параметра}
- /// Копирует содержимое из исходной области памяти в целевую область память
- /// \param[out] dest Целевая область памяти
- /// \param[in] src Исходная область памяти
- /// \param[in] n Количество байтов, которые необходимо скопировать
- /// \return {описание_возвращаемого_значения}
- /// \throw std::bad_alloc В случае возникновения ошибки при выделении памяти
protected string Concat(List<string> l)
{
@@ -67,6 +80,19 @@ namespace ModelData.BusinessModel.BaseAndInterface
return r;
}
+
+
+ /// \fn protected string Concat(Dictionary<string, string> l)
+ ///
+ /// \brief Объединяет все непустые (Value) элементы из Dictionary в строку
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \param l A Dictionary<string,string> to process.
+ ///
+ /// \returns A string.
+
protected string Concat(Dictionary<string, string> l)
{
string r = "";
@@ -75,102 +101,7 @@ namespace ModelData.BusinessModel.BaseAndInterface
if (s.Value != null && s.Value != "")
r += s.Key + " : " + s.Value + "\n";
return r;
- }
-
- /*
- /// Набор возможных состояний объекта
- enum States {
- Disabled, ///< Указывает, что элемент недоступен для использования
- Undefined, ///< Указывает, что состояние элемента неопределенно
- Enabled, ///< Указывает, что элемент доступен для использования
- }
- */
-
- /*
-
- \defgroup <идентификатор> (заголовок модуля)
- \defgroup maze_generation Генерация лабиринтов
- \brief Данный модуль, предназначен для генерации лабиринтов.
-
- На данный момент он поддерживает следующие алгоритмы генерации лабиринтов: Eller's algorithm, randomized Kruskal's algorithm, cellular automaton algorithm, randomized Prim's algorithm.
-
- .......
-
- \ingroup <идентификатор> (заголовок модуля) - это для добавления каждого блока в группу
-
- .......
-
- \addtogroup <идентификатор> [(заголовок модуля)]
- \addtogroup FooGroup
- \{ @{
-
- Summon a goat
-
- \param name The name of the goat;
- \return The summoned goat;
-
- Goat summon_goat(const char* name);
-
- ...
- ...
-
- \} @}
-
- */
-
- /*! \defgroup main_module Главный модуль */
-
- /*! \defgroup second_module Вложенный модуль
- \ingroup main_module
- */
-
-
- /*
- \brief Алгоритм Евклида
- \param a,b Два числа, чей наибольший делитель мы хотим найти
-
- Данная функция реализует алгоритм Евклида, при помощи которого
- находится наибольшее общее кратное у двух чисел.
-
- Код функции выглядит следующим образом:
- \code
- int gcd(int a, int b) {
- int r;
- while (b) {
- r = a % b;
- a = b;
- b = r;
- }
- return r;
- }
- \endcode
-
- int gcd(int a, int b);
- */
-
- /*
- \callgraph
- \callergraph
- */
-
- /*! \file
- Компоновщик (англ. Composite pattern) — структурный шаблон проектирования, объединяющий объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково. Ниже представлена иллюстрация данного шаблона при помощи UML:
- \startuml
- interface Component {
- +doThis()
- }
- class Composite {
- -elements
- +addElement()
- +doThis()
- }
- class Leaf {
- +doThis()
- }
- Component <|-- Leaf
- Component<|-- Composite
- Composite o-- Component
- \enduml
- */
+ }
}
+ /// @}
}
diff --git a/ModelData/BusinessModel/BaseAndInterface/I_URLcs.cs b/ModelData/BusinessModel/BaseAndInterface/I_URLcs.cs
index f676384..4d28bab 100644
--- a/ModelData/BusinessModel/BaseAndInterface/I_URLcs.cs
+++ b/ModelData/BusinessModel/BaseAndInterface/I_URLcs.cs
@@ -8,10 +8,31 @@ using Tools;
namespace ModelData.BusinessModel.BaseAndInterface
{
+ /// \interface I_URLcs
+ ///
+ /// \brief Отражает сущность с URL и названием.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+
interface I_URLcs
{
+ /// \property string Title
+ ///
+ /// \brief Название сущности
+ /// Установлен атрибут IndexAttrib со значением 1
+ /// \returns The title.
+
[IndexAttrib(1)] string Title { get; }
+
+
+ /// \property string URL
+ ///
+ /// \brief URL сущности
+ /// Установлен атрибут IndexAttrib со значением 0
+ /// \returns The URL.
+
[IndexAttrib(0)] string URL { set; get; }
}
}
diff --git a/ModelData/BusinessModel/ExtraEntities/Founder.cs b/ModelData/BusinessModel/ExtraEntities/Founder.cs
index 241aea2..f53aeac 100644
--- a/ModelData/BusinessModel/ExtraEntities/Founder.cs
+++ b/ModelData/BusinessModel/ExtraEntities/Founder.cs
@@ -10,14 +10,57 @@ using Tools;
namespace ModelData.BusinessModel.ExtraEntities
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class Founder
+ ///
+ /// \brief Отражает сущность основателя поселения Помимо наследуемых свойств, описывает
+ /// дополнительную информацию об основателе.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+
public class Founder : BaseOntologyEntity
{
- [IndexAttrib(2)]
- public string Name { set; get; }
- [IndexAttrib(3)]
- public string FounderRegion { set; get; }
- [IndexAttrib(4)]
- public string Nationality { set; get; }
+ /// \property public string Name
+ ///
+ /// \brief Имя основателя, если это некоторая историческая личность.
+ /// Установлен атрибут IndexAttrib со значением 2
+ /// \returns The name.
+
+ [IndexAttrib(2)] public string Name { set; get; }
+
+
+
+ /// \property public string FounderRegion
+ ///
+ /// \brief Наименование региона, который является родиной народа- или личности-основателя.
+ /// Установлен атрибут IndexAttrib со значением 3
+ /// \returns The founder region.
+
+ [IndexAttrib(3)] public string FounderRegion { set; get; }
+
+
+
+ /// \property public string Nationality
+ ///
+ /// \brief Национальность народа- или личности-основателя.
+ /// Установлен атрибут IndexAttrib со значением 4
+ /// \returns The nationality.
+
+ [IndexAttrib(4)] public string Nationality { set; get; }
+
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
public override Dictionary<string, string> Serialize()
{
@@ -31,4 +74,7 @@ namespace ModelData.BusinessModel.ExtraEntities
};
}
}
+
+
+ /// @}
}
diff --git a/ModelData/BusinessModel/ExtraEntities/Region.cs b/ModelData/BusinessModel/ExtraEntities/Region.cs
index 640be97..df2e789 100644
--- a/ModelData/BusinessModel/ExtraEntities/Region.cs
+++ b/ModelData/BusinessModel/ExtraEntities/Region.cs
@@ -10,16 +10,37 @@ using Tools;
namespace ModelData.BusinessModel.ExtraEntities
{
+ /// \addtogroup Entities
+ /// @{
+
/// \class Region
///
- /// \brief A region.
- ///
- /// \author Deniska
- /// \date 14.03.2019
+ /// \brief Класс, отражающий сущность административно-территориальной единицы (региона)
+ /// Помимо наследуемых свойств, обладает свойством включения в другой регион.
+ /// \author Denis
+ /// \date 30.03.2019
public class Region : BaseOntologyEntity
{
+ /// \property public Region partOfRegion
+ ///
+ /// \brief Регион, в состав которого входит данная сущность (тоже регион)
+ /// Установлен атрибут IndexAttrib со значением 2
+ /// \returns The part of region.
+
[IndexAttrib(2)] public Region partOfRegion { set; get; }
+
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public override Dictionary<string, string> Serialize()
{
return new Dictionary<string, string>()
@@ -30,4 +51,5 @@ namespace ModelData.BusinessModel.ExtraEntities
};
}
}
+ /// @}
}
diff --git a/ModelData/BusinessModel/ExtraEntities/SettlementType.cs b/ModelData/BusinessModel/ExtraEntities/SettlementType.cs
index c932eb8..753c431 100644
--- a/ModelData/BusinessModel/ExtraEntities/SettlementType.cs
+++ b/ModelData/BusinessModel/ExtraEntities/SettlementType.cs
@@ -9,10 +9,47 @@ using Tools;
namespace ModelData.BusinessModel.ExtraEntities
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class SettlementType
+ ///
+ /// \brief Отражает сущность типа поселения
+ /// Включает описание типа поселений, например промежуток количества населения для данного типа, и другие названия данного типа.
+ /// \author Denis
+ /// \date 30.03.2019
+
public class SettlementType:BaseOntologyEntity
{
+ /// \property public string Description
+ ///
+ /// \brief Описание типа поселения
+ /// Установлен атрибут IndexAttrib со значением 2
+ /// \returns The description.
+
[IndexAttrib(2)] public string Description { set; get; }
+
+
+
+ /// \property public List<string> AlternativeName
+ ///
+ /// \brief Набор альтернативных названий текущего типа поселения
+ /// Установлен атрибут IndexAttrib со значением 3
+ /// \returns The name of the alternative.
+
[IndexAttrib(3)] public List<string> AlternativeName { set; get; }
+
+
+
+ /// \fn public override Dictionary<string,string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public override Dictionary<string,string> Serialize()
{
return new Dictionary<string, string>()
@@ -24,4 +61,5 @@ namespace ModelData.BusinessModel.ExtraEntities
};
}
}
+ /// @}
}
diff --git a/ModelData/BusinessModel/MainEntities/EditedSettlement.cs b/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
index 9bd15f8..488c950 100644
--- a/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
+++ b/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
@@ -12,39 +12,163 @@ using Tools;
namespace ModelData.BusinessModel.MainEntities
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class EditedSettlement
+ ///
+ /// \brief Описывает сущность измененного поселения
+ /// Измененное поселение содержит дополнительную информацию об основном поселении.
+ /// Обязательными параметрами являются:ссылка на основное поселение; url; точный год, к которому относится информация; источник данных.
+ /// \warning При автоматической сериализации возможна закольцовка, т.к. класс содержит ссылку на основное поселение, а основное поселение содержит ссылки на все измененные, относящиемся к нему.
+ /// \author Denis
+ /// \date 30.03.2019
+
public class EditedSettlement : BaseOntologyEntity
{
#region Обязательные данные
- // URL
+ /// \property public Settlement before
+ ///
+ /// \brief Ссылка на экземпляр основного поселения
+ /// Обязательное свойство. Установлен атрибут IndexAttrib со значением 2
+ /// \returns The before.
[IndexAttrib(2)] public Settlement before { set; get; }
+
+
+
+ /// \property public InstantTime hasBeginning
+ ///
+ /// \brief Точный год, к которому относится информация
+ /// Обязательное свойство. Установлен атрибут IndexAttrib со значением 3
+ /// \returns The has beginning.
+
[IndexAttrib(3)] public InstantTime hasBeginning { set; get; }
+
+
+
+ /// \property public string Source
+ ///
+ /// \brief Источник данных
+ /// Может содержать URL, ISBN, точное наименование научной работы и т.п.
+ /// Обязательное свойство. Установлен атрибут IndexAttrib со значением 4
+ /// \returns The source.
+
[IndexAttrib(4)] public string Source { set; get; }
#endregion
#region Необязательные данные
- // Title
-
+ /// \property public SettlementType Type
+ ///
+ /// \brief Тип поселения
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 5
+ /// \returns The type.
+
[IndexAttrib(5)] public SettlementType Type { set; get; }
+
+
+
+ /// \property public Region Region
+ ///
+ /// \brief Регион, в составе которого находится поселение
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 6
+ /// \returns The region.
+
[IndexAttrib(6)] public Region Region { set; get; }
+
+
+
+ /// \property public int? PopulationAll
+ ///
+ /// \brief Общее количество населения
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 7
+ /// \returns The population all.
+
[IndexAttrib(7)] public int? PopulationAll { set; get; }
+
+ /// \property public int? PopulationMales
+ ///
+ /// \brief Количество мужского населения
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 8
+ /// \returns The population males.
+
[IndexAttrib(8)] public int? PopulationMales { set; get; }
+
+
+
+ /// \property public int? PopulationFemales
+ ///
+ /// \brief Количество женского населения
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 9
+ /// \returns The population females.
+
[IndexAttrib(9)] public int? PopulationFemales { set; get; }
+
+
+
+ /// \property public List<string> AlternativeName
+ ///
+ /// \brief Другие названия поселения
+ /// Количество может быть равно 0 или более
+ /// Установлен атрибут IndexAttrib со значением 10
+ /// \returns The name of the alternative.
+
[IndexAttrib(10)] public List<string> AlternativeName { set; get; }
+
+
+
+ /// \property public Dictionary<string, string> Others
+ ///
+ /// \brief Dictionary, содержащий разную информацию
+ /// Это свойство-заглушка на тот случай, если нужно быстро добавить какую-то информацию, которая не отражена в других свойствах.
+ /// Такой подход создает довольно гибкую структуру описания имеющейся информации, но затрудняет восприятие того, что действительно необходимо знать о поселении.
+ ///
+ /// Количество может быть равно 0 или более
+ /// Установлен атрибут IndexAttrib со значением 11
+ /// \warning На данный момент вся требуемая информация отражена в свойствах, поэтому данная коллекция не заполняется и не выводится.
+ /// \date 30.03.2019
+ /// \returns The others.
+
[IndexAttrib(11)] public Dictionary<string, string> Others { set; get; }
#endregion
#region Конструктор
+ /// \fn protected EditedSettlement()
+ ///
+ /// \brief Protected конструктор
+ /// Думаю, его нужно создать, мало ли, но фактически он пока не используется
+ /// \author Denis
+ /// \date 30.03.2019
+
protected EditedSettlement()
{
Init();
}
+
+
+ /// \fn public EditedSettlement(string URL, Settlement before, InstantTime hasBeginning, string Source)
+ ///
+ /// \brief Основной конструктор
+ /// Запрашивает все необходимые параметры, согласно архитектуре онтологии.
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \param URL URL измененного поселения.
+ /// \param before Ссылка на экземпляр основного поселения.
+ /// \param hasBeginning Точный год.
+ /// \param Source Источник.
+
public EditedSettlement(string URL, Settlement before, InstantTime hasBeginning, string Source)
{
this.URL = URL;
@@ -55,12 +179,32 @@ namespace ModelData.BusinessModel.MainEntities
Init();
}
+
+
+ /// \fn protected void Init()
+ ///
+ /// \brief Инициализация
+ /// Создает новые коллекции для List других имён и Dictionary другой информации
+ /// \author Denis
+ /// \date 30.03.2019
+
protected void Init()
{
AlternativeName = new List<string>();
Others = new Dictionary<string, string>();
}
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public override Dictionary<string, string> Serialize()
{
return new Dictionary<string, string>()
@@ -78,4 +222,5 @@ namespace ModelData.BusinessModel.MainEntities
#endregion
}
+ /// @}
}
diff --git a/ModelData/BusinessModel/MainEntities/MapPoint.cs b/ModelData/BusinessModel/MainEntities/MapPoint.cs
index 3283a81..3db420f 100644
--- a/ModelData/BusinessModel/MainEntities/MapPoint.cs
+++ b/ModelData/BusinessModel/MainEntities/MapPoint.cs
@@ -9,19 +9,85 @@ using Tools;
namespace ModelData.BusinessModel.MainEntities
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class MapPoint
+ ///
+ /// \brief Описывает точку на карте
+ /// Класс описывает точку на карте и включает лишь необходимые для этого сведения, том числе и фильтруемую информацию.
+ /// \author Denis
+ /// \date 31.03.2019
+
public class MapPoint : BaseAndInterface.BaseOntologyEntity
{
+ /// \property public string Position
+ ///
+ /// \brief Строковое представление координат
+ /// Установлен атрибут IndexAttrib со значением 2
+ /// \returns The position.
+
[IndexAttrib(2)] public string Position { set; get; }
+
+
+
+ /// \property public string Population
+ ///
+ /// \brief Строковое значение количества населения
+ /// Значение обязательно >= 0 - это гарантируется SPARQL запросом.
+ /// В качестве значения выбирается наибольшее среди всех измененных поселений за выбранный промежуток.
+ /// Установлен атрибут IndexAttrib со значением 3.
+ /// \returns The population.
+
[IndexAttrib(3)] public string Population { set; get; }
+
+
+
+ /// \property public List<string> Type
+ ///
+ /// \brief Список типов, к которым относится поселение
+ /// Заполняется из всех измененных поселений за выбранный промежуток.
+ /// Количество от 0 и больше.
+ /// Установлен атрибут IndexAttrib со значением 4.
+ /// \returns The type.
+
[IndexAttrib(4)] public List<string> Type { set; get; }
+
+ /// \property public List<string> Region
+ ///
+ /// \brief Список регионов, в составе которых находится поселение
+ /// Заполняется из всех измененных поселений за выбранный промежуток.
+ /// Количество от 0 и больше.
+ /// Установлен атрибут IndexAttrib со значением 5.
+ /// \returns The region.
+
[IndexAttrib(5)] public List<string> Region { set; get; }
+
+ /// \fn public MapPoint()
+ ///
+ /// \brief Конструктор
+ /// Создает экземпляры двух используемых списков
+ /// \author Denis
+ /// \date 31.03.2019
+
public MapPoint()
{
Type = new List<string>();
Region = new List<string>();
}
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public override Dictionary<string, string> Serialize()
{
return new Dictionary<string, string>()
@@ -36,4 +102,5 @@ namespace ModelData.BusinessModel.MainEntities
}
}
+ /// @}
}
ModelData/BusinessModel/MainEntities/Settlement.cs 113(+110 -3)
diff --git a/ModelData/BusinessModel/MainEntities/Settlement.cs b/ModelData/BusinessModel/MainEntities/Settlement.cs
index 772aeb6..7d86935 100644
--- a/ModelData/BusinessModel/MainEntities/Settlement.cs
+++ b/ModelData/BusinessModel/MainEntities/Settlement.cs
@@ -12,13 +12,29 @@ using Tools;
namespace ModelData.BusinessModel.MainEntities
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class Settlement
+ ///
+ /// \brief Описывает сущность поселения
+ /// Поселение содержит всю известную информацию об одноименной сущности в онтологии
+ /// Все относящиеся к основному поселению сведения содержатся здесь, все прочие - в измененных поселениях
+ /// Основное поселение имеет List измененных поселений для доступа к сведениям о них
+ /// Обязательными параметрами являются: url; отображаемое название; географические координаты.
+ /// \warning При автоматической сериализации возможна закольцовка, т.к. класс содержит ссылки на измененные поселения, а измененные поселения содержат ссылку на основное.
+ /// \author Denis
+ /// \date 31.03.2019
+
public class Settlement : BaseOntologyEntity
{
#region Обязательные данные
- // URL
-
- // Title
+ /// \property public Coordinate Coordinate
+ ///
+ /// \brief Координаты поселения
+ /// Обязательное свойство. Установлен атрибут IndexAttrib со значением 2
+ /// \returns The coordinate.
[IndexAttrib(2)] public Coordinate Coordinate { set; get; }
@@ -26,26 +42,96 @@ namespace ModelData.BusinessModel.MainEntities
#region Необязательные данные
+ /// \property public InstantTime hasBeginning
+ ///
+ /// \brief Год основания поселения
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 3
+ /// \returns The has beginning.
+
[IndexAttrib(3)] public InstantTime hasBeginning { set; get; }
+
+
+
+ /// \property public Founder Founder
+ ///
+ /// \brief Основатель поселения
+ /// Личность или народ-основатель поселения.
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 4
+ /// \returns The founder.
+
[IndexAttrib(4)] public Founder Founder { set; get; }
+
+
+
+ /// \property public string Legend
+ ///
+ /// \brief История основания поселения
+ /// Содержит ссылку или текст об основании поселения.
+ /// Может быть задан или равняться null.
+ /// Установлен атрибут IndexAttrib со значением 5
+ /// \returns The legend.
+
[IndexAttrib(5)] public string Legend { set; get; }
+
+
+
+ /// \property public Dictionary<string, string> Others
+ ///
+ /// \brief Dictionary, содержащий разную информацию
+ /// Это свойство-заглушка на тот случай, если нужно быстро добавить какую-то информацию, которая не отражена в других свойствах.
+ /// Такой подход создает довольно гибкую структуру описания имеющейся информации, но затрудняет восприятие того, что действительно необходимо знать о поселении.
+ ///
+ /// Количество может быть равно 0 или более
+ /// Установлен атрибут IndexAttrib со значением 6
+ /// \warning На данный момент вся требуемая информация отражена в свойствах, поэтому данная коллекция не заполняется и не выводится.
+ /// \returns The others.
+
[IndexAttrib(6)] public Dictionary<string, string> Others { set; get; }
#endregion
#region Служебные данные
+ /// \property public List<EditedSettlement> EditedSettlements
+ ///
+ /// \brief Список измененных поселений
+ /// Содержит ссылки на экземпляры всех изменных поселений, относящихся к основному.
+ /// Установлен атрибут IndexAttrib со значением 7.
+ /// \returns The edited settlements.
+
[IndexAttrib(7)] public List<EditedSettlement> EditedSettlements { set; get; }
#endregion
#region Конструктор
+ /// \fn protected Settlement()
+ ///
+ /// \brief Protected конструктор
+ /// Думаю, его нужно создать, мало ли, но фактически он пока не используется
+ /// \author Denis
+ /// \date 31.03.2019
+
protected Settlement()
{
Init();
}
+
+
+ /// \fn public Settlement(string URL, string Title, Coordinate Coordinate)
+ ///
+ /// \brief Основной конструктор
+ /// Запрашивает все необходимые параметры, согласно архитектуре онтологии.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param URL URL.
+ /// \param Title Отображаемое название.
+ /// \param Coordinate Координаты.
+
public Settlement(string URL, string Title, Coordinate Coordinate)
{
this.URL = URL;
@@ -55,12 +141,32 @@ namespace ModelData.BusinessModel.MainEntities
Init();
}
+
+
+ /// \fn protected void Init()
+ ///
+ /// \brief Инициализация
+ /// Создает новые коллекции для List измененных поселений и Dictionary другой информации
+ /// \author Denis
+ /// \date 31.03.2019
+
protected void Init()
{
Others = new Dictionary<string, string>();
EditedSettlements = new List<EditedSettlement>();
}
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
public override Dictionary<string, string> Serialize()
{
List<string> edited = new List<string>();
@@ -80,4 +186,5 @@ namespace ModelData.BusinessModel.MainEntities
#endregion
}
+ /// @}
}
ModelData/BusinessModel/RDF/Queries.cs 252(+231 -21)
diff --git a/ModelData/BusinessModel/RDF/Queries.cs b/ModelData/BusinessModel/RDF/Queries.cs
index d6c700b..f8ae1b8 100644
--- a/ModelData/BusinessModel/RDF/Queries.cs
+++ b/ModelData/BusinessModel/RDF/Queries.cs
@@ -6,11 +6,22 @@ using System.Threading.Tasks;
namespace ModelData.BusinessModel.RDF
{
- public static class Queries
+ /// \addtogroup RDF
+ /// @{
+
+ /// \class Queries
+ ///
+ /// \brief Класс, содержащий текст запросов
+ /// Методы класса возвращают строку с запросом, при необходимости подставляют параметры
+ /// \author Denis
+ /// \date 31.03.2019
+
+ public class Queries
{
#region Prefixes
- private static readonly Dictionary<string, string> Prefixes = new Dictionary<string, string>
+ /// \brief Доступное для чтения поле, содержащее краткий префикс (Key) и полное значение (Value) используемого ресурса
+ public static readonly Dictionary<string, string> Prefixes = new Dictionary<string, string>
{
["rdf"] = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#>",
["rdfs"] = "<http://www.w3.org/2000/01/rdf-schema#>",
@@ -21,17 +32,66 @@ namespace ModelData.BusinessModel.RDF
["time"] = "<https://www.w3.org/2006/time#>",
["map"] = "<http://jena.denhome.keenetic.link/map#>",
["foaf"] = "<http://xmlns.com/foaf/0.1/>"
- };
+ };
#endregion
#region Queries
+ /// \fn public static string AllSettlementsInInterval(string from, string to)
+ ///
+ /// \brief Выполняет поиск поселений и изменных поселений в определенном временном интервале.
+ /// \code
+ ///SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
+ ///WHERE
+ ///{
+ /// ?settlement a map:Settlement;
+ /// geonames:name ?title;
+ /// geo:lat ?lat;
+ /// geo:long ?long.
+ /// OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
+ /// FILTER (!bound(?wasFound) || ?wasFoundYear >= "from"^^xsd:gYear )
+ /// {
+ /// SELECT ?settlement (MAX(?populationNotNULL) AS ?maxc)
+ /// WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
+ /// ?date time:year ?year.
+ /// FILTER (?year >= "from"^^xsd:gYear && ?year <= "to"^^xsd:gYear )
+ /// OPTIONAL {?editedSettlement geonames:population ?population.}
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ ///
+ /// ## заполни переменную ?populationNotNULL так: если ?population НЕ задан (т.е. NULL), тогда 0, иначе (т.е. задан) ?population
+ /// BIND (IF (!BOUND(?population), "0"^^xsd:integer, ?population) as ?populationNotNULL)
+ /// }
+ /// Group by ?settlement
+ /// }
+ /// {
+ /// SELECT ?settlement ?settlementType ?typeName ?region ?regionName
+ /// WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
+ /// ?date time:year ?year.
+ /// FILTER (?year >= "from"^^xsd:gYear && ?year <= "to"^^xsd:gYear )
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ /// OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
+ /// }
+ /// }
+ ///}
+ /// \endcode
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param from С какого года выполнять поиск.
+ /// \param to По какой год выполнять поиск.
+ ///
+ /// \returns A string.
+
public static string AllSettlementsInInterval(string from, string to)
{
return GetAllPrefixes() +
@"
-SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
+ SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
WHERE
{
?settlement a map:Settlement;
@@ -69,6 +129,59 @@ WHERE
";
}
+
+
+ /// \fn public static string InfoAboutSettlement(string URL)
+ ///
+ /// \brief Полная информация о поселении
+ /// \code
+ ///SELECT DISTINCT ?title ?lat ?long ?wasFoundYear ?legend ?founder ?person ?foundersRegion ?editedSettlement ?source ?year ?settlementType ?typeName ?region ?regionName ?editedName ?alternateName ?population ?populationFemales ?populationMales
+ ///WHERE
+ ///{
+ /// {
+ /// SELECT * WHERE
+ /// {
+ /// url_ geonames:name ?title;
+ /// geo:lat ?lat; geo:long ?long.
+ ///
+ /// OPTIONAL {url_ time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
+ /// OPTIONAL {url_ map:legend ?legend.}
+ /// OPTIONAL
+ /// {
+ /// url_ map:founder ?founder.
+ /// OPTIONAL {?founder foaf:Person ?person}
+ /// OPTIONAL {?founder map:foundersRegion ?foundersRegion}
+ /// }
+ /// }
+ /// }
+ /// UNION
+ /// {
+ /// SELECT * WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement;
+ /// time:before url_;
+ /// map:source ?source;
+ /// time:hasBeginning ?date.
+ /// ?date time:year ?year.
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ /// OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
+ /// OPTIONAL {?editedSettlement geonames:name ?editedName.}
+ /// OPTIONAL {?editedSettlement geonames:alternateName ?alternateName.}
+ /// OPTIONAL {?editedSettlement geonames:population ?population.}
+ /// OPTIONAL {?editedSettlement map:populationFemalesCount ?populationFemales.}
+ /// OPTIONAL {?editedSettlement map:populationMalesCount ?populationMales.}
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ /// }
+ /// }
+ ///}
+ /// \endcode
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param URL URL искомого поселения.
+ ///
+ /// \returns A string.
+
public static string InfoAboutSettlement(string URL)
{
string url_ = GetObjFromURL(URL);
@@ -115,26 +228,52 @@ WHERE
}";
}
- public static string AllSettlementsName(string subName)
- {
- return GetPrefix("map") + GetPrefix("geonames") +
-@"
-select distinct ?name
-where
-{
- ?settlement a map:Settlement; geonames:name ?name.
- FILTER regex(?name, " + '"' + subName + "\", \"i\"" + @")
-}
-";
- }
+
+
+ /// \fn public static string Years()
+ ///
+ /// \brief Запрос наименьшего и наибольшего упоминаего годов
+ /// \code
+ ///SELECT ?min ?max
+ ///WHERE
+ ///{
+ /// {
+ /// SELECT (MIN(?year) AS ?minEditedYear) (MAX(?year) AS ?maxEditedYear)
+ /// WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement; time:hasBeginning ?date.
+ /// ?date time:year ?year.
+ /// }
+ /// }
+ /// {
+ /// SELECT (MIN(?minIndSetYear) AS ?minSetYear) (MAX(?maxIndSetYear) AS ?maxSetYear)
+ /// WHERE
+ /// {
+ /// ?settlement a map:Settlement.
+ /// OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
+ ///
+ /// ## костыль
+ /// ## если поля не существовали, MIN возвращал 1 вместо NULL, поэтому нарочно кастую к невозможным значениям, чтобы потом сравнить с существующими (см. другие два BIND)
+ /// BIND (IF (!BOUND(?wasFound), "3000"^^xsd:gYear, ?wasFoundYear) as ?minIndSetYear)
+ /// BIND (IF (!BOUND(?wasFound), "-3000"^^xsd:gYear, ?wasFoundYear) as ?maxIndSetYear)
+ /// }
+ /// }
+ /// ## выбрать наименьшую упоминаемую дату среди *наименьшей даты основания* и *наименьшей даты изменения*
+ /// BIND (IF (?minSetYear < ?minEditedYear, ?minSetYear, ?minEditedYear) as ?min)
+ /// BIND (IF (?maxSetYear > ?maxEditedYear, ?maxSetYear, ?maxEditedYear) as ?max)
+ ///}
+ /// \endcode
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns A string.
public static string Years()
{
return GetAllPrefixes() +
-@"
-SELECT ?min ?max
+@"SELECT ?min ?max
WHERE
- {
+{
{
SELECT (MIN(?year) AS ?minEditedYear) (MAX(?year) AS ?maxEditedYear)
WHERE
@@ -156,10 +295,43 @@ WHERE
BIND (IF (!BOUND(?wasFound), " + "\"-3000\"" + @"^^xsd:gYear, ?wasFoundYear) as ?maxIndSetYear)
}
}
- ## выбрать наименьшую упоминаемую дату среди *наименьшей даты основания* и *наименьшей даты изменения*
+ ## выбрать наименьшую упоминаемую дату среди *наименьшей даты основания* и *наименьшей даты изменения*
BIND (IF (?minSetYear < ?minEditedYear, ?minSetYear, ?minEditedYear) as ?min)
BIND (IF (?maxSetYear > ?maxEditedYear, ?maxSetYear, ?maxEditedYear) as ?max)
- }
+}
+";// @;
+ }
+
+
+
+ /// \fn public static string AllSettlementsName(string subName)
+ ///
+ /// \brief Поиск всех поселений, чьи названия включают переданную подстроку
+ /// \code
+ ///select distinct ?name
+ ///where
+ ///{
+ /// ?settlement a map:Settlement; geonames:name ?name.
+ /// FILTER regex(?name, "subName", "i")
+ ///}
+ /// \endcode
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param subName Подстрока для поиска.
+ ///
+ /// \returns A string.
+
+ public static string AllSettlementsName(string subName)
+ {
+ return GetPrefix("map") + GetPrefix("geonames") +
+@"
+select distinct ?name
+where
+{
+ ?settlement a map:Settlement; geonames:name ?name.
+ FILTER regex(?name, " + '"' + subName + "\", \"i\"" + @")
+}
";
}
@@ -167,6 +339,19 @@ WHERE
#region Tools
+ /// \fn private static string GetObjFromURL(string URL)
+ ///
+ /// \brief Получение URL, отделенного от префикса
+ /// Выполняет отделение значимой части полного URL от постоянного префикса
+ /// Например, полный URL: "http://jena.denhome.keenetic.link/map#Saratov_btjzkyfa_origin", где "http://jena.denhome.keenetic.link/map#" - префикс, а "Saratov_btjzkyfa_origin" - значимая часть.
+ /// \warning Если префикса нет в списке всех префиксов, отделить части не получится и будет возвращен переданный полный URL.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param URL Полный URL сущности.
+ ///
+ /// \returns The object from URL.
+
private static string GetObjFromURL(string URL)
{
string[] input = URL.Split('#');
@@ -180,11 +365,35 @@ WHERE
return (url_ != "") ? url_ : URL;
}
+
+
+ /// \fn private static string GetPrefix(string key)
+ ///
+ /// \brief Составляет строку из префикса и его значения
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param key Ключ - краткое наименование префикса.
+ ///
+ /// \returns The prefix.
+
private static string GetPrefix(string key)
{
return "PREFIX " + key + ": " + Prefixes[key] + " ";
}
+
+
+ /// \fn private static string GetAllPrefixes()
+ ///
+ /// \brief Составляет строку из всех префиксов
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns all prefixes.
+
private static string GetAllPrefixes()
{
string t = "";
@@ -198,6 +407,7 @@ WHERE
#endregion
}
+ /// @}
}
/*
ModelData/BusinessModel/RDF/RDFQuery.cs 50(+43 -7)
diff --git a/ModelData/BusinessModel/RDF/RDFQuery.cs b/ModelData/BusinessModel/RDF/RDFQuery.cs
index 827c666..42ea13e 100644
--- a/ModelData/BusinessModel/RDF/RDFQuery.cs
+++ b/ModelData/BusinessModel/RDF/RDFQuery.cs
@@ -12,16 +12,51 @@ using Tools.Config;
namespace ModelData.BusinessModel.RDF
{
+ /*!
+ \defgroup RDF Обращение к онтологии
+ \brief Группа классов, работающих непосредственно с точками доступа и онтологией.
+
+ Содержит класс для отправки запроса/получения ответа и статичный класс со всеми возможными запросами.
+ @{
+ */
+
+ /// \class RDFQuery
+ ///
+ /// \brief Выполняет отправку запроса и получение результата.
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+
public class RDFQuery
{
- public enum QueryType { Years, AllSettlements, SettlementInfo, SubName };
+ /// \enum QueryType
+ ///
+ /// \brief Тип запроса, который будет использован
+ /// В зависимости от типа запроса выбирается текст запроса, используемые параметры и точка обращения.
+
+ public enum QueryType
+ {
+ Years, ///< Запрос максимального и минимального годов. Параметры не требуются. Вернет одну строку.
+ AllSettlements, ///< Запрос всех поселений. Нужен для создания точек карты. Два параметра: требуемые года. Вернет большой список.
+ SettlementInfo, ///< Запрос все информации об одном поселении. Один параметр: URL поселения. Вернет список, где одна строка про поселение и все остальные строки про измененные поселения.
+ SubName ///< Запрос всех имен поселений, часть названия которых совпадает с параметром. Один параметр: подстрока для поиска. Вернет большой список.
+ };
+
+ /// \fn public static List<SparqlResult> GetData(QueryType queryType, string[] args = null)
+ ///
+ /// \brief Получить результат запроса
+ /// Общий метод отправки запроса к точке доступа. Запрос и его параметры регулируются параметрами метода.
+ /// Точка доступа регулируется типом запроса.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \exception Exception "не подходящий тип запроса".
+ ///
+ /// \param queryType Тип запроса.
+ /// \param args (необязательный) Массив строк, используемый в качестве параметров запросов.
+ ///
+ /// \returns The data.
- /// <summary>
- /// Получить результат запроса к SPARQL точке.
- /// </summary>
- /// <param name="queryType">Тип запроса. Обязателен</param>
- /// <param name="args">Параметры запроса. В зависимости от типа запроса обязателен или нет</param>
- /// <returns></returns>
public static List<SparqlResult> GetData(QueryType queryType, string[] args = null)
{
string exQuery;
@@ -67,4 +102,5 @@ namespace ModelData.BusinessModel.RDF
return results.Results;
}
}
+ /// @}
}
ModelData/BusinessModel/Tools/Coordinate.cs 92(+83 -9)
diff --git a/ModelData/BusinessModel/Tools/Coordinate.cs b/ModelData/BusinessModel/Tools/Coordinate.cs
index d5b7a23..a77e442 100644
--- a/ModelData/BusinessModel/Tools/Coordinate.cs
+++ b/ModelData/BusinessModel/Tools/Coordinate.cs
@@ -7,42 +7,115 @@ using System.ComponentModel;
namespace ModelData.BusinessModel.Tools
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class Coordinate
+ ///
+ /// \brief Сущность географических координат
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+
public class Coordinate
{
- [DisplayName("Ширина")]
- public double Lat { set; get; }
+ /// \property public double Lat
+ ///
+ /// \brief Географическая широта
+ ///
+ /// \returns The lat.
+
+ [DisplayName("Широта")] public double Lat { set; get; }
+
+
+
+ /// \property public double Long
+ ///
+ /// \brief Географическая долгота
+ ///
+ /// \returns The long.
- [DisplayName("Долгота")]
- public double Long { set; get; }
+ [DisplayName("Долгота")] public double Long { set; get; }
+
+ /// \fn public Coordinate()
+ ///
+ /// \brief Стандартный конструктор
+ /// Значения заполняются 0.
+ /// \author Denis
+ /// \date 31.03.2019
+
public Coordinate()
{
Lat = 0;
Long = 0;
}
+
+
+
+ /// \fn public Coordinate(VDS.RDF.INode long_, VDS.RDF.INode lat_)
+ ///
+ /// \brief Конструктор на основе полученного из онтологии значения
+ /// В качестве параметров передаются два "узла", которые являются результатом запроса из онтологии
+ /// \warning Мои запросы ! требуют наличия координат, поэтому передаваемые значения никогда не будут null. Поэтому данная проверка не используется.
+ /// \warning Нет проверки на правильность полученного значения, т.к. на данный момент онтология заполнялась вручную и все данные были верные.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param long_ Результат запроса из онтологии "долгота".
+ /// \param lat_ Результат запроса из онтологии "широта".
+
public Coordinate(VDS.RDF.INode long_, VDS.RDF.INode lat_)
{
this.Lat = double.Parse(long_.ToString().Split('^')[0].Replace('.', ','));
this.Long = double.Parse(lat_.ToString().Split('^')[0].Replace('.', ','));
}
+
+
+
+ /// \fn public Coordinate(double x, double y)
+ ///
+ /// \brief Конструктор на основе double значения
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param x Координата широты.
+ /// \param y Координата долготы.
+
public Coordinate(double x, double y)
{
this.Lat = x;
this.Long = y;
}
+
+
+
+ /// \fn public Coordinate(Coordinate origin)
+ ///
+ /// \brief Конструктор копирования
+ ///
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param origin The origin.
+
public Coordinate(Coordinate origin)
{
Lat = origin.Lat;
Long = origin.Long;
}
+ /// \fn public override string ToString()
+ ///
+ /// \brief Возвращает строку, представляющую текущий объект.
+ /// Будучи базовой сущностью (не унаследованной от BaseOntologyEntity) требует преобразования в строку.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns Строка, представляющая текущий объект.
- public static bool TryParse(string src, out Coordinate val)
- {
- val = new Coordinate();
- return true;
- }
public override string ToString()
{
return Lat + " " + Long;
@@ -50,4 +123,5 @@ namespace ModelData.BusinessModel.Tools
}
+ /// @}
}
\ No newline at end of file
ModelData/BusinessModel/Tools/InstantTime.cs 90(+90 -0)
diff --git a/ModelData/BusinessModel/Tools/InstantTime.cs b/ModelData/BusinessModel/Tools/InstantTime.cs
index 2989e9b..356a882 100644
--- a/ModelData/BusinessModel/Tools/InstantTime.cs
+++ b/ModelData/BusinessModel/Tools/InstantTime.cs
@@ -6,20 +6,73 @@ using System.Threading.Tasks;
namespace ModelData.BusinessModel.Tools
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class InstantTime
+ ///
+ /// \brief Сущность точного года
+ /// Используется в качестве минимальной временной единицы согласно онтологической модели.
+ /// \warning Кажется тут я накосячил с тем, что нельзя присвоить год вручную.
+ /// \todo Сделать set value, где вызывается Init(int?).
+ /// \author Denis
+ /// \date 31.03.2019
+
public class InstantTime
{
+
+ /// \brief Скрытое поле, содержащее год
private int? year;
+ /// \property public int? Year
+ ///
+ /// \brief Получить значение года
+ ///
+ /// \returns The year.
+
public int? Year
{
get { return year; }
}
+
+
+ /// \fn public InstantTime()
+ ///
+ /// \brief Стандартный конструктор
+ /// Год принимает значение null. Требуется присвоить значение
+ /// \author Denis
+ /// \date 31.03.2019
+
public InstantTime() { }
+
+
+
+ /// \fn public InstantTime(int? year)
+ ///
+ /// \brief Конструктор на основе целочисленного года
+ /// Вызов метода Init(int?)
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param year The year.
+
public InstantTime(int? year)
{
Init(year);
}
+
+
+
+ /// \fn public InstantTime(string year)
+ ///
+ /// \brief Конструктор на основе строкового года
+ /// Вызов метода Init(string)
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param year The year.
+
public InstantTime(string year)
{
if (year == null)
@@ -31,6 +84,19 @@ namespace ModelData.BusinessModel.Tools
Init(year);
}
+
+
+ /// \fn private void Init(int? year)
+ ///
+ /// \brief Присваивает значение закрытому полю
+ /// Если переданное значение = null, значение поля становится null
+ /// Иначе проверяется значение: год не может быть меньше 2000 до н.э. и больше текущего года.
+ /// Если проверка не пройдена, году устанавливается значение текущего года.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param year The year.
+
private void Init(int? year)
{
if (year.HasValue)
@@ -38,14 +104,38 @@ namespace ModelData.BusinessModel.Tools
else
this.year = null;
}
+
+
+
+ /// \fn private void Init(string year)
+ ///
+ /// \brief Присваивает значение закрытому полю
+ /// Преобразует строковое значение в целочисленное и вызывает метод Init(int?)
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \param year The year.
+
private void Init(string year)
{
this.Init(int.Parse(year));
}
+
+
+ /// \fn public override string ToString()
+ ///
+ /// \brief Возвращает строку, представляющую текущий объект.
+ /// Будучи базовой сущностью (не унаследованной от BaseOntologyEntity) требует преобразования в строку.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns Строка, представляющая текущий объект.
+
public override string ToString()
{
return Year.ToString();
}
}
+ /// @}
}
ModelData/BusinessModel/Tools/Period.cs 37(+37 -0)
diff --git a/ModelData/BusinessModel/Tools/Period.cs b/ModelData/BusinessModel/Tools/Period.cs
index 9deaeba..bec8b13 100644
--- a/ModelData/BusinessModel/Tools/Period.cs
+++ b/ModelData/BusinessModel/Tools/Period.cs
@@ -6,14 +6,51 @@ using System.Threading.Tasks;
namespace ModelData.BusinessModel.Tools
{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class Period
+ ///
+ /// \brief Сущность временного периода
+ /// Изначально был запланирован согласно онтологической модели.
+ /// Пока не используется.
+ /// \author Denis
+ /// \date 31.03.2019
+
public class Period
{
+ /// \property public InstantTime Begin
+ ///
+ /// \brief Точный год начала периода
+ ///
+ /// \returns The begin.
+
public InstantTime Begin { set; get; }
+
+
+
+ /// \property public InstantTime End
+ ///
+ /// \brief Точный год окончания периода
+ ///
+ /// \returns The end.
+
public InstantTime End { set; get; }
+ /// \fn public override string ToString()
+ ///
+ /// \brief Возвращает строку, представляющую текущий объект.
+ /// Будучи базовой сущностью (не унаследованной от BaseOntologyEntity) требует преобразования в строку.
+ /// \author Denis
+ /// \date 31.03.2019
+ ///
+ /// \returns Строка, представляющая текущий объект.
+
public override string ToString()
{
return Begin + " : " + End;
}
}
+
+ /// @}
}
Tools/Main/Extensions.cs 115(+115 -0)
diff --git a/Tools/Main/Extensions.cs b/Tools/Main/Extensions.cs
new file mode 100644
index 0000000..fb4b272
--- /dev/null
+++ b/Tools/Main/Extensions.cs
@@ -0,0 +1,115 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Reflection;
+
+namespace Tools
+{
+ public static class Extensions
+ {
+ private class Enumrable
+ {
+ private object Collection;
+ private object Enumerator;
+
+ private PropertyInfo Property_Current;
+ private MethodInfo Method_MoveNext;
+
+ public Enumrable(object enum_obj)
+ {
+
+ Collection = enum_obj;
+ Type collection_type = Collection.GetType();
+
+ try
+ {
+ Enumerator = collection_type.GetMethod("GetEnumerator").Invoke(Collection, null);
+
+ Type enumerator_type = Enumerator.GetType();
+
+ Property_Current = enumerator_type.GetProperty("Current");
+ Method_MoveNext = enumerator_type.GetMethod("MoveNext");
+ }
+ catch
+ {
+ throw new Exception(string.Format("{0} doesn't IEnumerable", enum_obj));
+ }
+ }
+
+ public object Current
+ {
+ get
+ {
+ return Property_Current.GetValue(Enumerator);
+ }
+ }
+ public bool MoveNext()
+ {
+ return (bool)Method_MoveNext.Invoke(Enumerator, null);
+ }
+ }
+
+ public static object[] EnumerableToObj(this object o)
+ {
+ List<object> res = new List<object>();
+
+ Enumrable enumrable = new Enumrable(o);
+
+ while (enumrable.MoveNext())
+ {
+ res.Add(enumrable.Current);
+ }
+
+ return res.ToArray();
+ }
+
+ public static List<KeyValuePair<object, object>> DictionaryToObj(this object o)
+ {
+ if (
+ !o.GetType().IsGenericType
+ || o.GetType().GetGenericTypeDefinition() != typeof(Dictionary<,>)
+ )
+ throw new Exception(string.Format("object {0} has type {1}. isn't Dictionary", o, o.GetType()));
+
+ List <KeyValuePair <object, object>> res = new List<KeyValuePair<object, object>>();
+
+ var ObjectArray = EnumerableToObj(o);
+
+ if (ObjectArray.Length == 0)
+ return res;
+
+ Type ElemType = ObjectArray.FirstOrDefault().GetType();
+
+ var PropertyKey = ElemType.GetProperty("Key");
+ var PropertyValue = ElemType.GetProperty("Value");
+
+ res.Capacity = ObjectArray.Length;
+
+ for (int i = 0; i < ObjectArray.Length; i++)
+ {
+ res.Add(new KeyValuePair<object, object>(PropertyKey.GetValue(ObjectArray[i]), PropertyValue.GetValue(ObjectArray[i])));
+ }
+
+ return res;
+ }
+
+ public static Dictionary<object, object> objToDictionary(this object o)
+ {
+ if (
+ !o.GetType().IsGenericType
+ || o.GetType().GetGenericTypeDefinition() != typeof(Dictionary<,>)
+ )
+ throw new Exception(string.Format("object {0} has type {1}. isn't Dictionary", o, o.GetType()));
+
+ Dictionary<object, object> res = new Dictionary<object, object>();
+
+ System.Collections.IDictionary t = (System.Collections.IDictionary)o;
+ foreach (var u in t.Keys)
+ res.Add(u, t[u]);
+
+ return res;
+ }
+ }
+}
Tools/Main/SerializeService.cs 48(+27 -21)
diff --git a/Tools/Main/SerializeService.cs b/Tools/Main/SerializeService.cs
index c300e83..907ee2e 100644
--- a/Tools/Main/SerializeService.cs
+++ b/Tools/Main/SerializeService.cs
@@ -9,19 +9,25 @@ namespace Tools
{
public class SerializeService
{
+ private class Pairs<TKey, TValue>
+ {
+ public TKey Key { set; get; }
+ public TValue Value { set; get; }
+ }
+
List<object> used = new List<object>();
public SerializeService()
{
used = new List<object>();
}
- public void RecursiveSerialize(object obj, Type _base, System.IO.Stream stream, string prefix = "")
+ public void RecursiveSerialize(object obj, Type _base, System.IO.MemoryStream memoryStream, string prefix = "")
{
if (used.Contains(obj))
return;
used.Add(obj);
string str;
- System.IO.StreamWriter file = new System.IO.StreamWriter(stream);
+ System.IO.StreamWriter file = new System.IO.StreamWriter(memoryStream);
var allPropertiesOfObj = obj.GetType().GetProperties().OrderBy(e => (e.GetCustomAttributes(typeof(IndexAttrib), true).FirstOrDefault() as IndexAttrib).Index);
foreach (var singleProperty in allPropertiesOfObj)
@@ -30,7 +36,7 @@ namespace Tools
if (type.IsSubclassOf(_base) && singleProperty.GetValue(obj) != null)
{
- RecursiveSerialize(singleProperty.GetValue(obj), _base, stream, prefix + "\t\t");
+ RecursiveSerialize(singleProperty.GetValue(obj), _base, memoryStream, prefix + "\t\t");
continue;
}
@@ -43,7 +49,7 @@ namespace Tools
if (singleProperty.GetValue(obj) is IEnumerable<object> t)
foreach (var u in t)
{
- RecursiveSerialize(u, _base, stream, prefix + "\t\t");
+ RecursiveSerialize(u, _base, memoryStream, prefix + "\t\t");
}
continue;
@@ -52,26 +58,25 @@ namespace Tools
if (
type.IsGenericType
&& type.GetGenericTypeDefinition() == typeof(Dictionary<,>)
- && typeof(string).Equals(type.GetGenericArguments()[0])
- && typeof(string).Equals(type.GetGenericArguments()[1])
+ //&& typeof(string).Equals(type.GetGenericArguments()[0])
+ //&& typeof(string).Equals(type.GetGenericArguments()[1])
)
- {
- if (
- typeof(string).Equals(type.GetGenericArguments()[0])
- && typeof(string).Equals(type.GetGenericArguments()[1])
- )
+ {
+ System.Collections.IDictionary t = (System.Collections.IDictionary)singleProperty.GetValue(obj);
+ foreach (var u in t.Keys)
{
- var t = singleProperty.GetValue(obj) as Dictionary<string, string>;
- foreach (var u in t)
- {
- file.WriteLine(u.Key + " : " + u.Value);
- }
- continue;
+ file.WriteLine(u + " : " + t[u]);
}
+ file.Flush();
+ continue;
+
}
str = singleProperty.GetValue(obj)?.ToString();
if (str != null && str != "")
+ {
file.WriteLine(prefix + "{0} : {1}", singleProperty.Name, str);
+ file.Flush();
+ }
/*
var obj = properties_sort[0].GetValue(a);
@@ -91,19 +96,20 @@ namespace Tools
}
- public static void Serialize(I_MySerializable obj, System.IO.Stream stream)
+ public static void Serialize(I_MySerializable obj, System.IO.MemoryStream memoryStream)
{
- System.IO.StreamWriter file = new System.IO.StreamWriter(stream);
+ System.IO.StreamWriter file = new System.IO.StreamWriter(memoryStream);
var serialize = obj.Serialize();
foreach (var elem in serialize)
if (elem.Value != null && elem.Value != "")
file.WriteLine(elem.Key + " : " + elem.Value);
+ file.Flush();
}
- public static void Serialize(List<I_MySerializable> info, System.IO.Stream stream)
+ public static void Serialize(List<I_MySerializable> info, System.IO.MemoryStream memoryStream)
{
foreach (var elem in info)
- Serialize(elem, stream);
+ Serialize(elem, memoryStream);
}
}
}
Tools/Tools.csproj 1(+1 -0)
diff --git a/Tools/Tools.csproj b/Tools/Tools.csproj
index eadc274..9dca9fe 100644
--- a/Tools/Tools.csproj
+++ b/Tools/Tools.csproj
@@ -70,6 +70,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
+ <Compile Include="Main\Extensions.cs" />
<Compile Include="Main\IndexAttribute.cs" />
<Compile Include="Config\ConfigManager.cs" />
<Compile Include="Interfaces\I_MySerializable.cs" />
web-map/Controllers/HomeController.cs 14(+7 -7)
diff --git a/web-map/Controllers/HomeController.cs b/web-map/Controllers/HomeController.cs
index 51c919a..f9e7cf0 100644
--- a/web-map/Controllers/HomeController.cs
+++ b/web-map/Controllers/HomeController.cs
@@ -10,8 +10,8 @@ namespace web_map.Controllers
{
public class HomeController : Controller
{
- SerialazService serialazService =
- new SerialazService();
+ //SerialazService serialazService =
+ // new SerialazService();
public ActionResult Index()
{
@@ -35,12 +35,12 @@ namespace web_map.Controllers
}
- public FileStreamResult GetFile(string URL)
- {
- var stream = serialazService.EntitysToDocx(new object[3]);
+ //public FileStreamResult GetFile(string URL)
+ //{
+ // var stream = serialazService.EntitysToDocx(new object[3]);
- return File(stream, "docx", URL+".docx");
- }
+ // return File(stream, "docx", URL+".docx");
+ //}
}
}
\ No newline at end of file