diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 86368345ad07c5564889724f135e89b0f6022894..5c49eb7e9c88346b8423a611dc14aca2e85cf346 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,3 +1,14 @@ FROM debian:buster -RUN apt-get update && \ - apt-get install curl mariadb-client make unzip -y +RUN apt-get update \ + && \ + apt-get install -y \ + curl \ + mariadb-client \ + make \ + unzip \ + python3-lxml \ + python3-pip \ + python3-sqlparse \ + python3-sphinx \ + doxygen +RUN pip3 install breathe sphinx-rtd-theme recommonmark diff --git a/.gitignore b/.gitignore index 0b8e594885fcd7ae70e753b3ef144ef9cb46ab66..26060c8b9c3986ed5a0803bcf1e1e2a88acee1a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# -*- mode:conf; -*- + # dot files .* !/.gitignore @@ -7,3 +9,8 @@ # dumps *.dump.sql libs/* + +# Generated files +_doxygen/ +_generated/ +/build/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 12e9b2e7837da3cae36be30e5f54ce343f75f5f3..510a4247f049dd4aacce81f98f73721422ebfb0a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -62,14 +62,34 @@ unittests: build-testenv: tags: [ cached-dind ] image: docker:19.03 + only: + - web + - shedules stage: setup - script: + script: - cd .docker - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY # use here general latest or specific branch latest... - - docker pull $CI_REGISTRY_IMAGE || true - docker build --pull - --cache-from $CI_REGISTRY_IMAGE -t $CI_REGISTRY_IMAGE . - docker push $CI_REGISTRY_IMAGE + +# Build the sphinx documentation and make it ready for deployment by Gitlab Pages +# documentation: +# stage: deploy + +# Special job for serving a static website. See https://docs.gitlab.com/ee/ci/yaml/README.html#pages +pages: + tags: [ docker ] + stage: deploy + only: + - dev + script: + - echo "Deploying" + - cat doc/index.rst + - make doc + - cp -r build/doc/html public + artifacts: + paths: + - public diff --git a/CHANGELOG.md b/CHANGELOG.md index 84fef2f494c6a8d01f0aac027a4452ab06d69627..64a0884f8f622824bb20d2711134e4a4a99e46f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,14 +9,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### +* Added a `_get_head_iversion` for non-api usage. +* Automated documentation builds: `make doc` + ### Changed ### +* `retrieveEntity` does not return the columns `VersionSeconds` and + `VersionNanos` anymore. +* `get_version_history` returns two additional columns, `child_username` and + `child_realm`. +* Added a `versioned` flag to the following procedures: + * `applyBackReference` + * `applyIDFilter` + * `applyPOV` + * `applyRefPOV` + * `makeStmt` + * `calcComplementUnion` + * `calcDifference` + * `calcIntersection` + * `finishSubProperty` + * `getChildren` + * `initEmptyTargetSet` + * `initDisjunctionFilter` + * `initEntity` + * `initQuery` + * `createTmpTable` +* Added a `direct` column to `archive_isa` table + ### Deprecated ### ### Removed ### +* unused procedures: + * `initNegationFilter` + * `initConjunctionFilter` + * `finishNegationFilter` + ### Fixed ### +* Fixed the `>=` and `<=` operators for comparisons in POV query filters with + stored DATE values. The fix makes the implementation consistent + However, the current definition and implementation of the + `>=` and `<=` operators for date and datetime is unintuitive and the operators + should have another name. Something like "overlap with or smaller/greater + than". +* Semi-fix in `retrieveEntityParents`. The old implementation was buggy and + would return no parent name or even a wrong one for old entity versions in + some cases. The semi-fix will allways return the current name of the parent + (even if this is historically not always correct). A real fix awaits the + implementation of versioned isa-relations which is already planned. +* Bug in `retrieveOverrides` function where selecting the datatype of an old + version resultet in an error. See corresponding test in `caosdb-pyinttest` + `tests/test_versioning.py::test_datatype_without_name` + ### Security ### ## 3.0.0 (2020-09-01) ## diff --git a/makefile b/Makefile similarity index 96% rename from makefile rename to Makefile index ddac9eda131f804f694ac99af1f495637af3a0aa..00d56e684d0c672a27636f69984ff8125c688854 100644 --- a/makefile +++ b/Makefile @@ -69,3 +69,8 @@ test-docker: test-docker-stop: docker kill caosdb-mysqlserver-test docker container rm caosdb-mysqlserver-test + +# Compile the standalone documentation +.PHONY: doc +doc: + $(MAKE) -C doc html diff --git a/README_SETUP.md b/README_SETUP.md index 6a28c66f2dd95483656da8544414d9b43deb88c2..d17adb60a48262c188deebabe847df884d4d51b4 100644 --- a/README_SETUP.md +++ b/README_SETUP.md @@ -27,7 +27,7 @@ ## Upgrade the SQL database -* Run `make upgrade`. This upgrades the database to the last version. +* Run `make upgrade`. This upgrades the database to the latest version. ## Drop Database @@ -73,5 +73,25 @@ with the then current version of the stored entities. ## Unit tests * We use [MyTAP-1.0](https://hepabolu.github.io/mytap/) for unit tests. +* Requirements: + * mysqladmin + * mysqldump + * mysql client program * Tests are in `tests/test_*.sql`. * Run `make test`. + * Alternatively, to run the tests in a containerized MariaDB instance, run `make test-docker`, + followed by `make test-docker-stop`. + +## Documentation # + +Build documentation in `build/` with `make doc`. + +## Requirements ## + +- sphinx +- sphinx-autoapi +- python3-sqlparse +- doxygen +- python3-lxml +- breathe (Doxygen extension for Sphinx) +- recommonmark diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 0000000000000000000000000000000000000000..bc8f072d81446c97083af89bdaaa057a0b02b435 --- /dev/null +++ b/doc/Doxyfile @@ -0,0 +1,2452 @@ +# -*- mode:conf; -*- +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "CaosDB MySQL Backend" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = _doxygen + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = YES + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = _generated + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = NO + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# The default value is: YES. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER = + +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a +# higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BATCHMODE = NO + +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HIDE_INDICES = NO + +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE = plain + +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTENSIONS_FILE = + +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_EXTENSION = .3 + +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. + +GENERATE_XML = YES + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_OUTPUT = xml + +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO, the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES, the include files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. +# The default value is: NO. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: YES. + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, +# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, +# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_CLEANUP = YES diff --git a/doc/Maintenance.rst b/doc/Maintenance.rst new file mode 100644 index 0000000000000000000000000000000000000000..fdec93084746ac3c6ef8a7ed6d018fd3ac7714aa --- /dev/null +++ b/doc/Maintenance.rst @@ -0,0 +1,24 @@ + +Maintenance +=========== + + +Creating a Backup +----------------- + + +You can use the Python script ``utils/backup.py`` to create a backup (SQL dump) +of the SQL-Backend:: + + utils/backup.py -d folder/where/the/backup/is/created + +You can do this while CaosDB is online. + +Restoring a Backup +------------------ +CaosDB should be offline for restoring. + +You can use the Bash script ``utils/make_db`` to restore a backup (SQL dump) +of the SQL-Backend:: + + make_db restore_db path/to/sql.dump diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..18fcdfd2bdc6ff10f5d891949961b96c7f58eb61 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,53 @@ +# ** header v3.0 +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> +# Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# ** end header + +# This Makefile is a wrapper for sphinx scripts. +# +# It is based upon the autocreated makefile for Sphinx documentation. + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= -a +SPHINXBUILD ?= sphinx-build +SPHINXAPIDOC ?= ./scripts/sql2sphinx.py +SQL_BASEFILES = ../procedures/*.sql +SOURCEDIR = . +BUILDDIR = ../build/doc + +.PHONY: doc-help Makefile apidoc doxygen + +# Put it first so that "make" without argument is like "make help". +doc-help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile doxygen + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) +# sphinx-build -M html . ../../build/doc + +apidoc: + @mkdir -p _generated + @$(SPHINXAPIDOC) --input $(wildcard $(SQL_BASEFILES)) > _generated/sql_sources.hh + +# Extract comments from sql files. +doxygen: apidoc + doxygen diff --git a/doc/README_SETUP.md b/doc/README_SETUP.md new file mode 120000 index 0000000000000000000000000000000000000000..01bfa9d9224dc7a39e782fb00f7306e31bd36a71 --- /dev/null +++ b/doc/README_SETUP.md @@ -0,0 +1 @@ +../README_SETUP.md \ No newline at end of file diff --git a/doc/concepts.rst b/doc/concepts.rst new file mode 100644 index 0000000000000000000000000000000000000000..7de8c512cba5c56780892bdd4f300c061cc8cdc3 --- /dev/null +++ b/doc/concepts.rst @@ -0,0 +1,8 @@ +======================== +The concepts of pycaosdb +======================== + +.. toctree:: + + Table structure <table_structure> + diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..dde0fdb1c7d96929eaa52b87ff4d26619aa1e529 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +import sphinx_rtd_theme + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('../caosdb')) + + +# -- Project information ----------------------------------------------------- + +project = 'caosdb-mysqlbackend' +copyright = '2020, IndiScale GmbH' +author = 'Daniel Hornung' + +# The short X.Y version +version = '3.0.0' +# The full version, including alpha/beta/rc tags +release = '3.0.0' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.todo', + 'breathe', + 'sphinx.ext.todo', + "sphinx.ext.autodoc", + "recommonmark", # For markdown files. + # 'autoapi.extension', + # 'sphinx.ext.intersphinx', + # 'sphinx.ext.napoleon', # For Google style docstrings + "sphinx_rtd_theme", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'caosdb-mysqlbackenddoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'caosdb-mysqlbackend.tex', 'caosdb-mysqlbackend Documentation', + 'IndiScale GmbH', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'caosdb-mysqlbackend', 'caosdb-mysqlbackend Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'caosdb-mysqlbackend', 'caosdb-mysqlbackend Documentation', + author, 'caosdb-mysqlbackend', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- + +# -- Options for breathe --------------------------------------------------- +# See also https://breathe.readthedocs.io/en/latest/quickstart.html + +breathe_projects = { + "mysqlbackend": "./_doxygen/xml" +} +breathe_default_project = "mysqlbackend" + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'https://docs.python.org/': None} + +# TODO Which options do we want? +autodoc_default_options = { + 'members': None, + 'undoc-members': None, +} diff --git a/doc/functions.rst b/doc/functions.rst new file mode 100644 index 0000000000000000000000000000000000000000..8648145d1967cf6b2593a8c2a38fb6a9664e399a --- /dev/null +++ b/doc/functions.rst @@ -0,0 +1,5 @@ +============================== +The (documented) SQL Functions +============================== + +.. doxygenindex:: diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..3924201bb5ab51ac7e1517f4eb1de95968dcb7b8 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,23 @@ + +Welcome to documentation of CaosDB's MySQL Backend! +=================================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + :hidden: + + Getting started <README_SETUP> + Concepts <concepts> + Maintenance + API documentation<functions> + +This documentation helps you to :doc:`get started<README_SETUP>`, explains the most important +:doc:`concepts<concepts>` . + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/doc/scripts/sql2sphinx.py b/doc/scripts/sql2sphinx.py new file mode 100755 index 0000000000000000000000000000000000000000..4a87d5a0769f8ca9be44a46036e136bfad1c148b --- /dev/null +++ b/doc/scripts/sql2sphinx.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2020 IndiScale GmbH <www.indiscale.com> +# Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +"""Convert an SQL script to a Python with the same function signatures.""" + +import argparse +import sys + +import sqlparse + + +MAINPAGE = """ + +/*! \\mainpage This autogenerated documentation from SQL. + * + * \\section function Global functions + * + * \\htmlonly The functions are listed <A href="globals.html">here</A>.\\endhtmlonly + */ + +""" + + +def _parse_file(filename): + """Parse and convert the file.""" + with open(filename, "r") as sqf: + sql = sqlparse.parsestream(sqf) + statements = list(sql) + + for stat in statements: + sublists = list(stat.get_sublists()) + for i, ident in enumerate(sublists): + if not (i > 0 and isinstance(ident, sqlparse.sql.Identifier) + and isinstance(sublists[i-1], sqlparse.sql.Comment)): + continue + comment = sublists[i-1] + after_comment = stat.tokens[stat.tokens.index(comment) + 1] + if not after_comment.value == "CREATE": + # print(after_comment.value) + continue + + print("/" * 78) + print("// taken from {filename}".format(filename=filename)) + print("/" * 78) + # print(type(ident)) + # print(ident) + # print(ident.tokens[-1]) + # print(ident.tokens[-1].tokens[1].tokens) + _print_header(comment.value, ident) + + +def _strip_whitespace(tokens): + """Remove whitespace tokens from the tokens list and return that.""" + to_delete = [] + for i, tok in enumerate(tokens): + if isinstance(tok, sqlparse.sql.Token) and tok.ttype in ( + sqlparse.tokens.Whitespace, sqlparse.tokens.Newline): + to_delete.append(i) + while to_delete: + tokens.pop(to_delete.pop()) + return tokens + + +def _print_header(comment, ident, outfile=sys.stdout): + """Print a C header with the given comment and identifier. + +Parameters +---------- +comment : str + +ident : sqlparse.sql.Identifier + """ + func = ident.token_matching(lambda tok: isinstance(tok, sqlparse.sql.Function), idx=0) + _strip_whitespace(func.tokens) + name, paren = func.tokens[0:2] + assert isinstance(paren, sqlparse.sql.Parenthesis) + + args = [] + # if name.value == "insert_single_child_version": + # from IPython import embed; embed() + _strip_whitespace(paren.tokens) + + # Expand nested elements + to_expand = {} + for tok in paren.tokens: + if isinstance(tok, sqlparse.sql.IdentifierList): + to_expand[tok] = _strip_whitespace(tok.tokens) + for old in to_expand: + pivot = paren.tokens.index(old) + paren.tokens = paren.tokens[:pivot] + to_expand[old] + paren.tokens[pivot+1:] + + + start = 0 + end = 0 + while end + 1 < len(paren.tokens): + start = end + 1 + punct = paren.token_matching(lambda t: t.ttype == sqlparse.tokens.Punctuation, idx=end+1) + if not punct: + continue + end = paren.tokens.index(punct) + if start == end: + continue + tokens = paren.tokens[start: end] + arg_name = _arg_from_tokens(tokens) + args.append(arg_name) + print(comment.strip(), file=outfile) + print("void {name}(void* {args});\n".format(name=name, args=", void* ".join(args)), + file=outfile) + + +def _arg_from_tokens(tokens): + """Extract and return an argument name.""" + # Remove content of functions + for i, tok in enumerate(tokens): + if isinstance(tok, sqlparse.sql.Function): + tokens[i] = tok.token_first() + + arg_name = "_".join([tok.value for tok in tokens]) + return arg_name.strip() + + +def _parse_arguments(): + """Parse the arguments.""" + parser = argparse.ArgumentParser(description='') + parser.add_argument('-i', '--input', help="Input file(s)", required=True, nargs="+") + + return parser.parse_args() + + +def main(): + """The main function of this script.""" + args = _parse_arguments() + print(MAINPAGE) + for filename in args.input: + _parse_file(filename=filename) + + +if __name__ == "__main__": + main() diff --git a/doc/table_structure.md b/doc/table_structure.md index 59958f5ff1b97caf9c791a1fbb5efce8fa2ca930..798404bc8c0ac19c7acfa64833082effedc9f0cd 100644 --- a/doc/table_structure.md +++ b/doc/table_structure.md @@ -101,7 +101,10 @@ There are a few extra tables for implementing versioning. Also there is a speci `value_iversion` in the `reference_data` table which stores the version of the referenced entity at the time of the version. If `value_iversion` is NULL, no specific version is stored. -### transactions ### +The `_iversion` is an incremental version counter, starting implicitly at 1. Previous versions of +entities are stored, along with their `_iversion`, in the `archive_*` tables. + +### `transactions` ### Replacement for `transaction_log`, holds ID, user and time of transaction: @@ -123,15 +126,15 @@ Versioning info for entities: - `_ipparent` :: Primary parent ID (internal) for this version, i.e. predecessor - `srid` :: Server request / transaction ID which created this version -### `archive_foo_data` ### +### `archive_footable` ### -Older (i.e. not current) data value, from previous versions of an entity. -- `domain_id` :: Same as in `foo_data`. -- `entity_id` :: Same as in `foo_data`. -- `property_id` :: Same as in `foo_data`. +Older (i.e. not current) data, from previous versions of an entity which were stored in `footable`. +- `domain_id` :: Same as in `footable`. +- `entity_id` :: Same as in `footable`. +- `property_id` :: Same as in `footable`. - `value` :: The value at the given version. - `status` :: The value at the given version. -- `pidx` :: Same as in `foo_data`. +- `pidx` :: Same as in `footable`. - `_iversion` :: Version index of this version. - ... :: Data type specific columns may also be there. diff --git a/patches/patch20201110-4.0.0-rc1/patch.sh b/patches/patch20201110-4.0.0-rc1/patch.sh new file mode 100755 index 0000000000000000000000000000000000000000..c784a055d2db19d6010647439c603daf9b7a0c27 --- /dev/null +++ b/patches/patch20201110-4.0.0-rc1/patch.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# ** header v3.0 +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2018 Research Group Biomedical Physics, +# Max-Planck-Institute for Dynamics and Self-Organization Göttingen +# Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> +# Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# ** end header +# +# Update mysql schema to version v4.0.0-rc1 +NEW_VERSION="v4.0.0-rc1" +OLD_VERSION="v3.0.0-rc2" + +if [ -z "$UTILSPATH" ]; then + UTILSPATH="../utils" +fi + +. $UTILSPATH/patch_header.sh $* + + +check_version $OLD_VERSION + +# * Add a `direct` column to `archive_isa` table +# * Remove unused procedures: +# * `initNegationFilter` +# * `initConjunctionFilter` +# * `finishNegationFilter` +mysql_execute_file $PATCH_DIR/update_archive_isa.sql + + +update_version $NEW_VERSION + +success + diff --git a/patches/patch20201110-4.0.0-rc1/update_archive_isa.sql b/patches/patch20201110-4.0.0-rc1/update_archive_isa.sql new file mode 100644 index 0000000000000000000000000000000000000000..9beaa857a28ec520a26b6e912e7ce0c9b918b76e --- /dev/null +++ b/patches/patch20201110-4.0.0-rc1/update_archive_isa.sql @@ -0,0 +1,27 @@ +/* + * This file is a part of the CaosDB Project. + * + * Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> + * Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +-- remove unused procedures +DROP PROCEDURE IF EXISTS db_2_0.initNegationFilter; +DROP PROCEDURE IF EXISTS db_2_0.initConjunctionFilter; +DROP PROCEDURE IF EXISTS db_2_0.finishNegationFilter; + +ALTER TABLE archive_isa + ADD COLUMN `direct` BOOLEAN DEFAULT TRUE; diff --git a/patches/patch20201124-4.0.0-rc2/patch.sh b/patches/patch20201124-4.0.0-rc2/patch.sh new file mode 100755 index 0000000000000000000000000000000000000000..5dab9326328a7e7c4d0eef88776438b0f9760fb7 --- /dev/null +++ b/patches/patch20201124-4.0.0-rc2/patch.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# ** header v3.0 +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2018 Research Group Biomedical Physics, +# Max-Planck-Institute for Dynamics and Self-Organization Göttingen +# Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> +# Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# ** end header +# +# Update mysql schema to version v4.0.0-rc1 +NEW_VERSION="v4.0.0-rc2" +OLD_VERSION="v4.0.0-rc1" + +if [ -z "$UTILSPATH" ]; then + UTILSPATH="../utils" +fi + +. $UTILSPATH/patch_header.sh $* + + +check_version $OLD_VERSION + +# nothing to do, just new implementations for the procedures + +update_version $NEW_VERSION + +success + diff --git a/procedures/deleteIsaCache.sql b/procedures/deleteIsaCache.sql index 114d66df2627a169c876ac5fd09f2e6cff193871..1ffff23e0b6e876ad8aaef21554a26f723cc6c94 100644 --- a/procedures/deleteIsaCache.sql +++ b/procedures/deleteIsaCache.sql @@ -50,12 +50,11 @@ BEGIN FROM entity_version WHERE entity_id = EntityID; - -- move to archive_isa before deleting (only direct child-parent relations) - INSERT INTO archive_isa (child, child_iversion, parent) - SELECT e.child, IVersion AS child_iversion, e.parent + -- move to archive_isa before deleting + INSERT IGNORE INTO archive_isa (child, child_iversion, parent, direct) + SELECT e.child, IVersion AS child_iversion, e.parent, rpath = EntityID FROM isa_cache AS e - WHERE e.child = EntityID - AND e.rpath = CAST(EntityID AS CHAR) COLLATE utf8_unicode_ci; + WHERE e.child = EntityID; END IF; DELETE FROM isa_cache diff --git a/procedures/entityVersioning.sql b/procedures/entityVersioning.sql index fe5169e09d94b1ea4d289d01a4bbc2a84e9e8967..24f629e72a7bdaa3eb9811b0c7a322fc7bcdbe8f 100644 --- a/procedures/entityVersioning.sql +++ b/procedures/entityVersioning.sql @@ -226,6 +226,38 @@ BEGIN END; // +DROP FUNCTION IF EXISTS db_2_0._get_head_iversion // + +/** + * Get the _iversion number of the HEAD of an entity. + * + * Parameters + * ---------- + * EntityID + * The entity id. + * + * Returns + * ------- + * The _iversion of the HEAD. + */ +CREATE FUNCTION db_2_0._get_head_iversion( + EntityID INT UNSIGNED) +RETURNS INT UNSIGNED +READS SQL DATA +BEGIN + -- This implementation assumes that the history is linear and the highest + -- _iversion number is always the head. This will not be correct anymore + -- as soon as branches may split and merge. Then, a walk over the primary + -- parents (_ipparent) will be necessary. + RETURN ( + SELECT e._iversion + FROM entity_version AS e + WHERE e.entity_id = EntityID + ORDER BY e._iversion DESC + LIMIT 1 + ); +END; + DROP FUNCTION IF EXISTS db_2_0.get_head_relative // @@ -298,7 +330,8 @@ END; DROP PROCEDURE IF EXISTS db_2_0.get_version_history // /** - * Select version timestamps of an entity. + * Select the complete transaction history of an entity (Who created which + * version and when). * * Parameters * ---------- @@ -307,8 +340,8 @@ DROP PROCEDURE IF EXISTS db_2_0.get_version_history // * * Selects * ------- - * Tuples (child, parent, child_seconds, child_nanos). `child` and `parent` are - * version IDs. + * Tuples (child, parent, child_seconds, child_nanos, child_username, + * child_realm). `child` and `parent` are version IDs. */ CREATE PROCEDURE db_2_0.get_version_history( in EntityID INT UNSIGNED) @@ -317,7 +350,9 @@ BEGIN SELECT c.version AS child, NULL as parent, t.seconds AS child_seconds, - t.nanos AS child_nanos + t.nanos AS child_nanos, + t.username AS child_username, + t.realm AS child_realm FROM entity_version AS c INNER JOIN transactions as t ON ( c.srid = t.srid ) WHERE c.entity_id = EntityID @@ -331,7 +366,9 @@ BEGIN UNION SELECT c.version AS child, p.version AS parent, t.seconds AS child_seconds, - t.nanos AS child_nanos + t.nanos AS child_nanos, + t.username AS child_username, + t.realm AS child_realm FROM entity_version AS p INNER JOIN entity_version as c INNER JOIN transactions AS t diff --git a/procedures/insertIsaCache.sql b/procedures/insertIsaCache.sql index 6b79750982c8b8fa6ba316358da817cdedb9932a..a05681df89e02f7c183f2b2ce70edca9a3864380 100644 --- a/procedures/insertIsaCache.sql +++ b/procedures/insertIsaCache.sql @@ -24,20 +24,21 @@ DROP PROCEDURE IF EXISTS db_2_0.insertIsa; DELIMITER // -/* Insert an "is a" relation - -This procedure fills the isa_cache table. All passed entities must be existing -in entities.id. - -Parameters -========== - -c : UNSIGNED -The child entity - -p : UNSIGNED -The parent entity -*/ +/** + * Insert an "is a" relation + * + * This procedure fills the isa_cache table. All passed entities must be existing + * in entities.id. + * + * Parameters + * ========== + * + * c : UNSIGNED + * The child entity + * + * p : UNSIGNED + * The parent entity + */ CREATE PROCEDURE db_2_0.insertIsa(IN c INT UNSIGNED, IN p INT UNSIGNED) insert_is_a_proc: BEGIN diff --git a/procedures/query/applyBackReference.sql b/procedures/query/applyBackReference.sql index 9a2450750b42963fcff5de1e02e0054097ecc7fa..2d74f74db8cc43e1b0c54c61d09c75042c2247ab 100644 --- a/procedures/query/applyBackReference.sql +++ b/procedures/query/applyBackReference.sql @@ -4,6 +4,9 @@ * * Copyright (C) 2018 Research Group Biomedical Physics, * Max-Planck-Institute for Dynamics and Self-Organization Göttingen + * Copyright (C) 2020 Indiscale GmbH <info@indiscale.com> + * Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> + * Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as @@ -24,39 +27,205 @@ DROP PROCEDURE IF EXISTS db_2_0.applyBackReference; DELIMITER // -CREATE PROCEDURE db_2_0.applyBackReference(in sourceSet VARCHAR(255), targetSet VARCHAR(255), in propertiesTable VARCHAR(255), in entitiesTable VARCHAR(255), in subQuery BOOLEAN) +/** + * Process a set of entities, keeping those which are referenced in a specific way. + * + * This procedure filters a source table and writes the result into a target table. If + * the target table is not given, all non-matching entries are deleted from the source table + * instead. + * + * Candidate entities are allowed to pass if there is an entity from the entities table which + * references the candidate as one of the properties in the properties table. + * + * Parameters + * ---------- + * sourceSet : table + * The name of the table which shall be filtered, must have column `id`. + * + * targetSet : table + * The name of the result table, must have column `id`. + * + * propertiesTable : table + * References as Properties in this table are counted. + * + * entitiesTable : table + * References by Entities in this table are counted. + * + * subQuery : boolean + * Create a temporary target table and select as `list`, instead of using the given targetSet. The + * `versioned` parameter has no effect in this case. + * + * versioned : boolean + * If True, if a reference is versioned (references to specific versions of entities), the target + * candidate's version must match. Therefore, the sourceSet and targetSet must have a `_iversion` + * column as well (unless sourceSet is the `entities` table). + * + */ +CREATE PROCEDURE db_2_0.applyBackReference(in sourceSet VARCHAR(255), targetSet VARCHAR(255), + in propertiesTable VARCHAR(255), in entitiesTable VARCHAR(255), in subQuery BOOLEAN, + in versioned BOOLEAN) BEGIN - DECLARE newTableName VARCHAR(255) DEFAULT NULL; + DECLARE newTableName VARCHAR(255) DEFAULT NULL; + + + IF subQuery IS TRUE THEN + call registerTempTableName(newTableName); + + SET @createBackRefSubQueryTableStr = CONCAT('CREATE TEMPORARY TABLE `',newTableName,'` ( entity_id INT UNSIGNED NOT NULL, id INT UNSIGNED NOT NULL, CONSTRAINT `',newTableName,'PK` PRIMARY KEY (id, entity_id))'); + + PREPARE createBackRefSubQueryTable FROM @createBackRefSubQueryTableStr; + EXECUTE createBackRefSubQueryTable; + DEALLOCATE PREPARE createBackRefSubQueryTable; + SET @backRefSubResultSetStmtStr = CONCAT('INSERT IGNORE INTO `', + newTableName, + '` (id,entity_id) SELECT entity_id AS id, value AS entity_id FROM `reference_data` AS data ', + 'WHERE EXISTS (SELECT 1 FROM `', + sourceSet, + '` AS source WHERE source.id=data.value LIMIT 1)', + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')) + ); - IF subQuery IS TRUE THEN - call registerTempTableName(newTableName); + PREPARE backRefSubResultSetStmt FROM @backRefSubResultSetStmtStr; + EXECUTE backRefSubResultSetStmt; + DEALLOCATE PREPARE backRefSubResultSetStmt; - SET @createBackRefSubQueryTableStr = CONCAT('CREATE TEMPORARY TABLE `',newTableName,'` ( entity_id INT UNSIGNED NOT NULL, id INT UNSIGNED NOT NULL, CONSTRAINT `',newTableName,'PK` PRIMARY KEY (id, entity_id))'); + SELECT newTableName as list; + ELSE + IF versioned THEN + IF sourceSet = "entities" THEN + -- Find any referenced entity, current or archived + SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id, _iversion) SELECT source.id, _get_head_iversion(source.id)', + -- current entities + ' FROM entities AS source WHERE EXISTS (', + 'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND (', + 'data.value_iversion IS NULL OR data.value_iversion=_get_head_iversion(source.id))', + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), + ') UNION ALL ', + -- and archived entities + 'SELECT source.id, source._iversion FROM archive_entities AS source WHERE EXISTS (', + 'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND ', + '(data.value_iversion IS NULL OR data.value_iversion=source._iversion)', + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), - PREPARE createBackRefSubQueryTable FROM @createBackRefSubQueryTableStr; - EXECUTE createBackRefSubQueryTable; - DEALLOCATE PREPARE createBackRefSubQueryTable; + ')'); + ELSEIF targetSet IS NULL OR sourceSet = targetSet THEN + SET @stmtBackRefStr = CONCAT('DELETE FROM `', + sourceSet, + '` WHERE NOT EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=`', + sourceSet, + '`.`id` AND ( data.value_iversion IS NULL OR data.value_iversion=`', + sourceSet, + '`._iversion)', + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), + ')'); + ELSE + SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id, _iversion) SELECT source.id, source._iversion FROM `', + sourceSet, + '` AS source WHERE EXISTS (', + 'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND', + ' (data.value_iversion IS NULL OR data.value_iversion=source._iversion)', + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), - SET @backRefSubResultSetStmtStr = CONCAT('INSERT IGNORE INTO `',newTableName,'` (id,entity_id) SELECT entity_id AS id, value AS entity_id FROM `reference_data` AS data WHERE EXISTS (SELECT 1 FROM `',sourceSet,'` AS source WHERE source.id=data.value LIMIT 1)', IF(propertiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',propertiesTable,'` AS p WHERE p.id=data.property_id LIMIT 1)')), IF(entitiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',entitiesTable,'` AS e WHERE e.id=data.entity_id LIMIT 1)'))); + ')'); + END IF; + ELSE + -- unversioned queries + IF targetSet IS NULL OR sourceSet = targetSet THEN + -- delete from sourceSet + SET @stmtBackRefStr = CONCAT('DELETE FROM `', + sourceSet, + '` WHERE NOT EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=`', + sourceSet, + '`.`id`', + IF(entitiesTable IS NULL, + '', + CONCAT(' + AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' + AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), + ')'); + ELSE + -- write to targetSet + SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id) SELECT id FROM `', + sourceSet, + '` AS source WHERE EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id', + IF(entitiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + entitiesTable, + '` AS e WHERE e.id=data.entity_id LIMIT 1)')), + IF(propertiesTable IS NULL, + '', + CONCAT(' AND EXISTS (SELECT 1 FROM `', + propertiesTable, + '` AS p WHERE p.id=data.property_id LIMIT 1)')), + ')'); + END IF; + END IF; - PREPARE backRefSubResultSetStmt FROM @backRefSubResultSetStmtStr; - EXECUTE backRefSubResultSetStmt; - DEALLOCATE PREPARE backRefSubResultSetStmt; + PREPARE stmtBackRef FROM @stmtBackRefStr; + EXECUTE stmtBackRef; + DEALLOCATE PREPARE stmtBackRef; + END IF; - SELECT newTableName as list; - ELSE - IF targetSet IS NULL OR sourceSet = targetSet THEN - SET @stmtBackRefStr = CONCAT('DELETE FROM `', sourceSet, '` WHERE NOT EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=`', sourceSet, '`.`id`', IF(entitiesTable IS NULL, '', CONCAT(' AND EXISTS (SELECT 1 FROM `', entitiesTable, '` AS e WHERE e.id=data.entity_id LIMIT 1)')), IF(propertiesTable IS NULL, '', CONCAT(' AND EXISTS (SELECT 1 FROM `', propertiesTable, '` AS p WHERE p.id=data.property_id LIMIT 1)')), ')'); - ELSE - SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` (id) SELECT id FROM `',sourceSet,'` AS source WHERE EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id', IF(entitiesTable IS NULL, '', CONCAT(' AND EXISTS (SELECT 1 FROM `', entitiesTable, '` AS e WHERE e.id=data.entity_id LIMIT 1)')), IF(propertiesTable IS NULL, '', CONCAT(' AND EXISTS (SELECT 1 FROM `', propertiesTable, '` AS p WHERE p.id=data.property_id LIMIT 1)')), ')'); - END IF; - - PREPARE stmtBackRef FROM @stmtBackRefStr; - EXECUTE stmtBackRef; - DEALLOCATE PREPARE stmtBackRef; - END IF; - END; // diff --git a/procedures/query/applyIDFilter.sql b/procedures/query/applyIDFilter.sql index 56adf53d19916049accbaf71e866ab36efb6abd2..c9b876420493a61da7ff174e58b750976b79520f 100644 --- a/procedures/query/applyIDFilter.sql +++ b/procedures/query/applyIDFilter.sql @@ -25,32 +25,106 @@ DROP PROCEDURE IF EXISTS db_2_0.applyIDFilter; DELIMITER // -CREATE PROCEDURE db_2_0.applyIDFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in o CHAR(2), in vInt BIGINT, in agg CHAR(3)) +/** + * Filter the sourceSet into targetSet by ID. + * + * This can be done by operator-value tests or by aggregate functions. + * + * The `versioned` flag currently only has the effect that an `_iversion` column is also copied to + * the target. + */ +CREATE PROCEDURE db_2_0.applyIDFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), + in o CHAR(2), in vInt BIGINT, in agg CHAR(3), in versioned BOOLEAN) IDFILTER_LABEL: BEGIN DECLARE data VARCHAR(20000) DEFAULT NULL; DECLARE aggVal VARCHAR(255) DEFAULT NULL; #-- get aggVal if possible IF agg IS NOT NULL THEN - SET @stmtIDAggValStr = CONCAT("SELECT ", agg, "(id) INTO @sAggVal FROM `", sourceSet, "`"); - PREPARE stmtIDAggVal FROM @stmtIDAggValStr; - EXECUTE stmtIDAggVal; + IF versioned THEN + -- TODO versioned queries + SELECT 1 FROM id_agg_with_versioning_not_implemented; + END IF; + SET @stmtIDAggValStr = CONCAT( + "SELECT ", + agg, + "(id) INTO @sAggVal FROM `", + sourceSet, + "`"); + PREPARE stmtIDAggVal FROM @stmtIDAggValStr; + EXECUTE stmtIDAggVal; DEALLOCATE PREPARE stmtIDAggVal; SET aggVal = @sAggVal; END IF; #-- generate stmt string IF targetSet IS NULL OR targetSet = sourceSet THEN - SET data = CONCAT("DELETE FROM `",sourceSet,"` WHERE ",IF(o IS NULL OR vInt IS NULL,"1=1",CONCAT("NOT id",o,vInt)),IF(aggVal IS NULL, "", CONCAT(" AND id!=",aggVal))); + SET data = CONCAT( + "DELETE FROM `", + sourceSet, + "` WHERE ", + IF(o IS NULL OR vInt IS NULL, + "1=1", + CONCAT("NOT id", + o, + vInt)), + IF(aggVal IS NULL, + "", + CONCAT(" AND id!=", + aggVal))); +ELSEIF versioned AND sourceSet = "entities" THEN + + -- ################# VERSIONING ##################### + SET data = CONCAT( + "INSERT IGNORE INTO `", + targetSet, + '` (id, _iversion) SELECT id, _get_head_iversion(id) FROM `entities` WHERE ', + IF(o IS NULL OR vInt IS NULL, + "1=1", + CONCAT("id", + o, + vInt)), + IF(aggVal IS NULL, + "", + CONCAT(" AND id=", + aggVal)), + ' UNION SELECT id, _iversion FROM `archive_entities` WHERE ', + IF(o IS NULL OR vInt IS NULL, + "1=1", + CONCAT("id", + o, + vInt)), + IF(aggVal IS NULL, + "", + CONCAT(" AND id=", + aggVal))); + -- ################################################## + ELSE - SET data = CONCAT("INSERT IGNORE INTO `",targetSet,"` SELECT data.id as id FROM `",sourceSet,"` AS data WHERE ",IF(o IS NULL OR vInt IS NULL,"1=1",CONCAT("data.id",o,vInt)),IF(aggVal IS NULL, "", CONCAT(" AND data.id=", aggVal))); + SET data = CONCAT( + "INSERT IGNORE INTO `", + targetSet, + IF(versioned, + '` (id, _iversion) SELECT data.id, data._iversion FROM `', + '` (id) SELECT data.id FROM `'), + sourceSet, + "` AS data WHERE ", + IF(o IS NULL OR vInt IS NULL, + "1=1", + CONCAT("data.id", + o, + vInt)), + IF(aggVal IS NULL, + "", + CONCAT(" AND data.id=", + aggVal))); END IF; Set @stmtIDFilterStr = data; PREPARE stmtIDFilter FROM @stmtIDFilterStr; EXECUTE stmtIDFilter; DEALLOCATE PREPARE stmtIDFilter; - + END; // diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index bf49d930a7daab9d1cd81de482b5dc6d8dd4f462..732854be91b5dcda817da3faa00c9ba727a31e3e 100644 --- a/procedures/query/applyPOV.sql +++ b/procedures/query/applyPOV.sql @@ -27,6 +27,19 @@ DROP PROCEDURE IF EXISTS db_2_0.applyPOV; DELIMITER // +/** + * Apply a Property-Operator-Value filter to sourceSet. + * + * The result is written to targetSet (non-matching rows are deleted in sourceSet if no targetSet is + * given). + * + * Parameters + * ---------- + * + * versioned : boolean + * If True, sourceSet and targetSet have an _iversion column, otherwise that column will be ignored + * (or only HEAD will be inserted into targetSet). + */ CREATE PROCEDURE db_2_0.applyPOV(in sourceSet VARCHAR(255), /* (?) Name of the table that the POV will be applied to. This can be a temporary table. */ in targetSet VARCHAR(255), /* (?) Name of the result table of this POV. */ in propertiesTable VARCHAR(255), @@ -51,7 +64,8 @@ CREATE PROCEDURE db_2_0.applyPOV(in sourceSet VARCHAR(255), /* (?) Name of the t in vDateTime VARCHAR(255), in vDateTimeDotNotation VARCHAR(255), in agg CHAR(3), /* an SQL aggregate function or NULL when no aggregation should be used */ - in pname VARCHAR(255)) /* name of the property, this name is only used for reporting more meaningful warnings */ + in pname VARCHAR(255), /* name of the property, this name is only used for reporting more meaningful warnings */ + in versioned BOOLEAN) POV_LABEL: BEGIN DECLARE data TEXT DEFAULT NULL; /*data subselect statement string*/ DECLARE sTextData VARCHAR(20000) DEFAULT NULL; /*SELECT PREFIX for data subselect plus WHERE CLAUSE for text_data*/ @@ -71,7 +85,7 @@ POV_LABEL: BEGIN IF o = '->' THEN #-- special case: pure reference property - call applyRefPOV(sourceSet,targetSet, propertiesTable, refIdsTable); + call applyRefPOV(sourceSet,targetSet, propertiesTable, refIdsTable, versioned); LEAVE POV_LABEL; ELSEIF o = '0' THEN #-- special case: property IS NULL @@ -98,17 +112,57 @@ POV_LABEL: BEGIN SELECT DISTINCT -> No duplicate values UNION ALL -> Allow also duplicate values */ - SET sTextData = 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `double_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE subdata.value IS NOT NULL'; - - ELSEIF o = "(" or o = "!(" THEN - SET sTextData = IF(vText IS NULL, ' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', - IF(vDateTimeDotNotation IS NULL, NULL, - CONCAT(' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ', getDateWhereClause(vDateTimeDotNotation, o)))); - SET sDatetimeData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', - IF(vDateTime IS NULL, NULL, - CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE ', getDateTimeWhereClause(vDateTime, o)))); + SET sTextData = CONCAT( + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `double_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata ', + 'WHERE subdata.value IS NOT NULL'); + + ELSEIF o = "(" or o = "!(" THEN -- datetime intervals + IF versioned THEN + SET sTextData = IF(vText IS NULL, + CONCAT( + ' SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) ', + 'AS _iversion, property_id FROM `date_data` UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_date_data`'), + IF(vDateTimeDotNotation IS NULL, NULL, -- vText and vDateTimeDotNotation are both given + CONCAT(' SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) ', + 'AS _iversion, property_id FROM `date_data` AS subdata WHERE ', + getDateWhereClause(vDateTimeDotNotation, o), ' UNION ALL ', + 'SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_date_data` ', + 'AS subdata WHERE ', getDateWhereClause(vDateTimeDotNotation, o)))); + SET sDatetimeData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `datetime_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_datetime_data`', + IF(vDateTime IS NULL, NULL, + CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `datetime_data` AS subdata WHERE ', getDateTimeWhereClause(vDateTime, o), ' UNION ALL SELECT DISTINCT domain_id, entity_id,_iversion, property_id FROM `archive_datetime_data` AS subdata WHERE ', getDateTimeWhereClause(vDateTime, o)))); + ELSE -- unversioned + SET sTextData = IF(vText IS NULL, + ' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', + IF(vDateTimeDotNotation IS NULL, NULL, + CONCAT(' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ', + getDateWhereClause(vDateTimeDotNotation, o)))); + SET sDatetimeData = IF(vText IS NULL, + ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', + IF(vDateTime IS NULL, NULL, + CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` ', + 'AS subdata WHERE ', getDateTimeWhereClause(vDateTime, o)))); + END IF; SET vText = NULL; ELSEIF agg IS NOT NULL THEN + IF versioned THEN + SELECT 1 FROM versioned_agg_pov_filter_not_implemented; + END IF; #-- find aggregated value (min/max...) #-- construct where clause @@ -116,7 +170,7 @@ POV_LABEL: BEGIN SET aggValueWhereClause = CONCAT(IF(aggValueWhereClause IS NULL, '', aggValueWhereClause), getAggValueWhereClause(sourceSet, propertiesTable)); #-- construct statement - SET @aggValueStmtStr = CONCAT('SELECT ',agg,'(subdata.value), ', agg, '(convert_unit(subdata.unit_sig,subdata.value)), COUNT(DISTINCT standard_unit(subdata.unit_sig)), max(standard_unit(subdata.unit_sig)) INTO @sAggValue, @sAggValueConvert, @distinctUnits, @StdUnitSig FROM (SELECT entity_id, property_id, value, unit_sig FROM `integer_data` UNION SELECT entity_id, property_id, value, unit_sig FROM `double_data`) AS subdata WHERE ', aggValueWhereClause); + SET @aggValueStmtStr = CONCAT('SELECT ',agg,'(subdata.value), ', agg, '(convert_unit(subdata.unit_sig,subdata.value)), COUNT(DISTINCT standard_unit(subdata.unit_sig)), max(standard_unit(subdata.unit_sig)) INTO @sAggValue, @sAggValueConvert, @distinctUnits, @StdUnitSig FROM (SELECT entity_id, property_id, value, unit_sig FROM `integer_data` UNION ALL SELECT entity_id, property_id, value, unit_sig FROM `double_data`) AS subdata WHERE ', aggValueWhereClause); #-- run statement PREPARE stmtAggValueStmt FROM @aggValueStmtStr; @@ -145,15 +199,34 @@ POV_LABEL: BEGIN SET vText = NULL; ELSE #-- generate statement parts - SET sTextData = IF(vText IS NULL, 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data`', CONCAT('SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata WHERE subdata.value ',o,' ?')); - SET sNameData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data`', CONCAT(' UNION SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data` AS subdata WHERE subdata.value ', o, ' ?')); - SET sEnumData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data`', CONCAT(' UNION SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata WHERE subdata.value ', o, ' ?')); - SET sIntData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, subdata.property_id FROM `integer_data` AS subdata', IF(vInt IS NULL AND vDoubleStdUnit IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata WHERE ', getDoubleWhereClause(vInt, unit_sig, vDoubleStdUnit, stdUnit_sig, o)))); - SET sDoubleData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, subdata.property_id FROM `double_data` AS subdata', IF(vDouble IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `double_data` AS subdata WHERE ', getDoubleWhereClause(vDouble,unit_sig,vDoubleStdUnit,stdUnit_sig,o)))); - SET sDatetimeData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', IF(vDateTime IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o)))); - SET sDateData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', IF(vDateTimeDotNotation IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ',getDateWhereClause(vDateTimeDotNotation,o)))); - SET sRefData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data`', IF(refIdsTable IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refIdsTable, '` AS refIdsTable WHERE subdata.value=refIdsTable.id LIMIT 1)'))); - SET sNullData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `null_data`', NULL); + IF versioned THEN + SET sTextData = IF(vText IS NULL, + 'SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `text_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_text_data` ', + CONCAT( + 'SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id ', + 'FROM `text_data` AS subdata WHERE subdata.value ', o,' ? ', + 'UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id ', + 'FROM `archive_text_data` AS subdata WHERE subdata.value ', o, '?' + )); + SET sNameData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `name_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_name_data` ', CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `name_data` AS subdata WHERE subdata.value ', o, ' ? UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_name_data` AS subdata WHERE subdata.value ', o, '?')); + SET sEnumData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `enum_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_enum_data` ', CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `enum_data` AS subdata WHERE subdata.value ', o, ' ? UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_enum_data` AS subdata WHERE subdata.value ', o, '?')); + SET sRefData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `reference_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_reference_data`', IF(refIdsTable IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refIdsTable, '` AS refIdsTable WHERE subdata.value=refIdsTable.id LIMIT 1) UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refIdsTable, '` AS refIdsTable WHERE subdata.value=refIdsTable.id LIMIT 1)'))); + SET sDoubleData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, _get_head_iversion(subdata.entity_id) AS _iversion, subdata.property_id FROM `double_data` AS subdata UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_double_data` ', IF(vDouble IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id), property_id FROM `double_data` AS subdata WHERE ', getDoubleWhereClause(vDouble,unit_sig,vDoubleStdUnit,stdUnit_sig,o), ' UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_double_data` AS subdata WHERE ', getDoubleWhereClause(vDouble, unit_sig, vDoubleStdUnit, stdUnit_sig, o)))); + SET sIntData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, _get_head_iversion(subdata.entity_id) AS _iversion, subdata.property_id FROM `integer_data` AS subdata UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_integer_data`', IF(vInt IS NULL AND vDoubleStdUnit IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `integer_data` AS subdata WHERE ', getDoubleWhereClause(vInt, unit_sig, vDoubleStdUnit, stdUnit_sig, o), ' UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_integer_data` AS subdata WHERE ', getDoubleWhereClause(vInt, unit_sig, vDoubleStdUnit, stdUnit_sig, o)))); + SET sDatetimeData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `datetime_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_datetime_data`', IF(vDateTime IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o), ' UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o)))); + SET sDateData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `date_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_date_data`', IF(vDateTimeDotNotation IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `date_data` AS subdata WHERE ', getDateWhereClause(vDateTimeDotNotation,o), ' UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_date_data` AS subdata WHERE ', getDateWhereClause(vDateTimeDotNotation,o)))); + SET sNullData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id FROM `null_data` UNION ALL SELECT DISTINCT domain_id, entity_id, _iversion, property_id FROM `archive_null_data`', NULL); + ELSE + SET sTextData = IF(vText IS NULL, 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data`', CONCAT('SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata WHERE subdata.value ',o,' ?')); + SET sNameData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data`', CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `name_data` AS subdata WHERE subdata.value ', o, ' ?')); + SET sEnumData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data`', CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata WHERE subdata.value ', o, ' ?')); + SET sRefData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data`', IF(refIdsTable IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refIdsTable, '` AS refIdsTable WHERE subdata.value=refIdsTable.id LIMIT 1)'))); + SET sDoubleData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, subdata.property_id FROM `double_data` AS subdata', IF(vDouble IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `double_data` AS subdata WHERE ', getDoubleWhereClause(vDouble,unit_sig,vDoubleStdUnit,stdUnit_sig,o)))); + SET sIntData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, subdata.property_id FROM `integer_data` AS subdata', IF(vInt IS NULL AND vDoubleStdUnit IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata WHERE ', getDoubleWhereClause(vInt, unit_sig, vDoubleStdUnit, stdUnit_sig, o)))); + SET sDatetimeData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', IF(vDateTime IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o)))); + SET sDateData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', IF(vDateTimeDotNotation IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ',getDateWhereClause(vDateTimeDotNotation,o)))); + SET sNullData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `null_data`', NULL); + END IF; END IF; @@ -170,34 +243,80 @@ POV_LABEL: BEGIN ); - call createTmpTable(keepTabl); - - #-- generate statement from statement parts - SET @stmtPOVkeepTblStr = CONCAT("INSERT IGNORE INTO `", keepTabl, "` (id) SELECT DISTINCT entity_id AS id FROM ", data, " as data", IF(propertiesTable IS NULL, '', CONCAT(' WHERE EXISTS (Select 1 from `', propertiesTable, '` AS prop WHERE prop.id = data.property_id AND (prop.id2=data.entity_id OR prop.id2=0))'))); + call createTmpTable(keepTabl, versioned); + IF versioned THEN + #-- generate statement from statement parts + SET @stmtPOVkeepTblStr = CONCAT( + 'INSERT IGNORE INTO `', keepTabl, '` (id, _iversion) SELECT entity_id AS id, _iversion FROM ', data, + ' as data', IF(propertiesTable IS NULL, '', CONCAT( + ' WHERE EXISTS (Select 1 from `', propertiesTable, '` AS prop ', + 'WHERE prop.id = data.property_id AND (prop.id2=data.entity_id OR prop.id2=0))'))); - SET @stmtPOVStr = CONCAT( - IF(targetSet IS NULL, - CONCAT('DELETE FROM `',sourceSet,'` WHERE NOT EXISTS (SELECT 1 FROM `'), - CONCAT('INSERT IGNORE INTO `',targetSet,'` (id) SELECT id FROM `',sourceSet,'` WHERE EXISTS (SELECT 1 FROM `')), - keepTabl, - '` AS data WHERE data.id=`', sourceSet, '`.`id` LIMIT 1)' - ); + IF targetSet IS NOT NULL THEN + SET @stmtPOVStr = CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id, _iversion) SELECT source.id, source._iversion FROM `', + keepTabl, + '` AS source'); + ELSE + -- unversioned shall not return any versions other than HEAD + SET @stmtPOVStr = CONCAT('DELETE FROM `', + sourceSet, + '` WHERE NOT EXISTS (SELECT 1 FROM `', + keepTabl, + '` AS data WHERE data.id=`', + sourceSet, + '`.`id` AND data._iversion=`', + sourceSet, + '`._iversion LIMIT 1)'); + END IF; - #-- prepare and execute - PREPARE stmt3 FROM @stmtPOVStr; - PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; - IF vText IS NULL THEN - EXECUTE stmtPOVkeepTbl; + #-- prepare and execute + PREPARE stmt3 FROM @stmtPOVStr; + PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; + IF vText IS NULL THEN + EXECUTE stmtPOVkeepTbl; + ELSE + SET @vText = vText; + EXECUTE stmtPOVkeepTbl USING @vText, @vText, @vText, @vText, @vText, @vText; + END IF; + EXECUTE stmt3; + DEALLOCATE PREPARE stmt3; + DEALLOCATE PREPARE stmtPOVkeepTbl; ELSE - SET @vText = vText; - EXECUTE stmtPOVkeepTbl USING @vText, @vText, @vText; - END IF; - EXECUTE stmt3; - DEALLOCATE PREPARE stmt3; - DEALLOCATE PREPARE stmtPOVkeepTbl; + #-- generate statement from statement parts + SET @stmtPOVkeepTblStr = CONCAT('INSERT IGNORE INTO `', keepTabl, '` (id) SELECT DISTINCT entity_id AS id FROM ', data, ' as data', IF(propertiesTable IS NULL, '', CONCAT(' WHERE EXISTS (Select 1 from `', propertiesTable, '` AS prop WHERE prop.id = data.property_id AND (prop.id2=data.entity_id OR prop.id2=0))'))); - /* Question: why select AS and not select INTO? */ + SET @stmtPOVStr = CONCAT( + IF(targetSet IS NULL, + CONCAT('DELETE FROM `', + sourceSet, + '` WHERE NOT EXISTS (SELECT 1 FROM `'), + CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id) SELECT id FROM `', + sourceSet, + '` WHERE EXISTS (SELECT 1 FROM `')), + keepTabl, + '` AS data WHERE data.id=`', + sourceSet, + '`.`id` LIMIT 1)' + ); + + #-- prepare and execute + PREPARE stmt3 FROM @stmtPOVStr; + PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; + IF vText IS NULL THEN + EXECUTE stmtPOVkeepTbl; + ELSE + SET @vText = vText; + EXECUTE stmtPOVkeepTbl USING @vText, @vText, @vText; + END IF; + EXECUTE stmt3; + DEALLOCATE PREPARE stmt3; + DEALLOCATE PREPARE stmtPOVkeepTbl; + END IF; SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet; diff --git a/procedures/query/applyRefPOV.sql b/procedures/query/applyRefPOV.sql index 0771d3d02051ac1388cf0792bdc680b9b9f9f1bd..a367408c37da4f839c432e366e8564255cd9b628 100644 --- a/procedures/query/applyRefPOV.sql +++ b/procedures/query/applyRefPOV.sql @@ -23,14 +23,28 @@ DROP PROCEDURE IF EXISTS db_2_0.applyRefPOV; DELIMITER // -CREATE PROCEDURE db_2_0.applyRefPOV(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in properties VARCHAR(255), in refs VARCHAR(255)) +CREATE PROCEDURE db_2_0.applyRefPOV(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), + in properties VARCHAR(255), in refs VARCHAR(255), + in versioned BOOLEAN) BEGIN - DECLARE data VARCHAR(20000) DEFAULT CONCAT('(SELECT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refs, '` AS refs WHERE subdata.value=refs.id LIMIT 1))'); - SET @stmtRefPOVStr = makeStmt(sourceSet,targetSet,data,properties); + DECLARE data VARCHAR(20000) DEFAULT CONCAT( + '(SELECT domain_id, entity_id, property_id FROM `reference_data` AS subdata ', + 'WHERE EXISTS (SELECT 1 FROM `', refs, '` AS refs WHERE subdata.value=refs.id LIMIT 1))'); + + IF versioned THEN + SET data = CONCAT( + '(SELECT domain_id, entity_id, _get_head_iversion(entity_id) AS _iversion, property_id ', + 'FROM `reference_data` AS subdata WHERE EXISTS (', + 'SELECT 1 FROM `', refs, '` AS refs WHERE subdata.value=refs.id LIMIT 1) ', + 'UNION ALL SELECT domain_id, entity_id, _iversion, property_id ', + 'FROM `archive_reference_data` AS subdata WHERE EXISTS (', + 'SELECT 1 FROM `', refs, '` AS refs WHERE subdata.value=refs.id LIMIT 1))'); + END IF; + SET @stmtRefPOVStr = makeStmt(sourceSet,targetSet,data,properties, versioned); PREPARE stmt4 FROM @stmtRefPOVStr; EXECUTE stmt4; - + SELECT @stmtRefPOVstr as applyRefPOVStmt; END; diff --git a/procedures/query/applyTransactionFilter.sql b/procedures/query/applyTransactionFilter.sql index b40b287b25bdd703337d50f3ca19d25d71bfcada..49a4edb931136b1e24afdf38acfdf90445159df1 100644 --- a/procedures/query/applyTransactionFilter.sql +++ b/procedures/query/applyTransactionFilter.sql @@ -39,7 +39,7 @@ BEGIN ')' ); - SET @stmtTransactionStr = makeStmt(sourceSet,targetSet,data,NULL); + SET @stmtTransactionStr = makeStmt(sourceSet, targetSet, data, NULL, FALSE); PREPARE stmtTransactionFilter from @stmtTransactionStr; IF userName IS NOT NULL THEN SET @userName = userName; diff --git a/procedures/query/calcComplementUnion.sql b/procedures/query/calcComplementUnion.sql index b0e70f744087672519957d0b9b6713d8ef3574a3..daaafa1934e58d53dbcc5cd17551c9353efa4571 100644 --- a/procedures/query/calcComplementUnion.sql +++ b/procedures/query/calcComplementUnion.sql @@ -23,15 +23,33 @@ DROP PROCEDURE IF EXISTS db_2_0.calcComplementUnion; +-- Apparently this code is not used anymore DELIMITER // -CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255)) +CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)'); + IF versioned AND universe = "entities" THEN + SET @stmtComplementUnionStr = CONCAT( + 'INSERT IGNORE INTO `', targetSet, + '` SELECT e.id, _get_head_iversion(e.id) FROM entities as e WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet, + '` AS diff WHERE diff.id=e.id AND diff._iversion = _get_head_iversion(e.id)) UNION ALL SELECT e.id, e._iversion FROM archive_entities AS e WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet, + '` as diff WHERE e.id = diff.id AND e._iversion = diff._iversion)'); + ELSEIF versioned THEN + SET @stmtComplementUnionStr = CONCAT( + 'INSERT IGNORE INTO `', targetSet, + '` SELECT id FROM `',universe, + '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet,'` + AS diff WHERE diff.id=universe.id AND diff._iversion = universe.id_version)'); + ELSE + SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)'); + END IF; PREPARE stmtComplementUnion FROM @stmtComplementUnionStr; EXECUTE stmtComplementUnion; DEALLOCATE PREPARE stmtComplementUnion; - + END; // diff --git a/procedures/query/calcDifference.sql b/procedures/query/calcDifference.sql index 279b8cbac73c43893086187a38ec693978e16791..c9788df0c4ea30e041441407c6f474a60cf01cfa 100644 --- a/procedures/query/calcDifference.sql +++ b/procedures/query/calcDifference.sql @@ -27,13 +27,20 @@ DROP PROCEDURE IF EXISTS db_2_0.calcDifference; DELIMITER // -CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255)) +/** + * Delete rows from `resultSetTable` which have a matching ID (an version) in `diff`. + */ +CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + IF versioned THEN + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id` AND diff._iversion=`', resultSetTable, '`.`_iversion`)'); + ELSE + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + END IF; PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; DEALLOCATE PREPARE diffStmt; - + END; // diff --git a/procedures/query/calcIntersection.sql b/procedures/query/calcIntersection.sql index e9f8616a6dc00dbd465151e2d637f1f74fb8d2a2..4cc90095bed2ea1bf9f2fa2f3190c8b62a974b38 100644 --- a/procedures/query/calcIntersection.sql +++ b/procedures/query/calcIntersection.sql @@ -25,9 +25,24 @@ DROP PROCEDURE IF EXISTS db_2_0.calcIntersection; DELIMITER // -CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255)) +/** + * Drop rows in `resultSetTable` which do not have a matching ID (and version) in `intersectWith`. + */ +CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + IF versioned THEN + SET @diffStmtStr = CONCAT('DELETE FROM `', + resultSetTable, + '` WHERE NOT EXISTS ( SELECT 1 FROM `', + intersectWith, + '` AS diff WHERE diff.id=`', + resultSetTable, + '`.`id` AND diff._iversion=`', + resultSetTable, + '`.`_iversion`)'); + ELSE + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + END IF; PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; diff --git a/procedures/query/calcUnion.sql b/procedures/query/calcUnion.sql index 7db35bb774659ae4d27ead20b92029991ef1fed3..006fb11aaa4695630db5d796d7048f7c9ca7ee5e 100644 --- a/procedures/query/calcUnion.sql +++ b/procedures/query/calcUnion.sql @@ -26,13 +26,16 @@ DROP PROCEDURE IF EXISTS db_2_0.calcUnion; DELIMITER // +/** + * Add the rows from `sourceSet` to `targetSet`. + */ CREATE PROCEDURE db_2_0.calcUnion(in targetSet VARCHAR(255), in sourceSet VARCHAR(255)) BEGIN - SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` (id) SELECT id FROM `',sourceSet,'`'); + SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT * FROM `',sourceSet,'`'); PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; DEALLOCATE PREPARE diffStmt; - + END; // diff --git a/procedures/query/cleanUpQuery.sql b/procedures/query/cleanUpQuery.sql index 7de562e8c1c210d91a6613319cb8254d780e4c83..7cf78a5951f306f373896cc3d854deeee16c206c 100644 --- a/procedures/query/cleanUpQuery.sql +++ b/procedures/query/cleanUpQuery.sql @@ -27,15 +27,20 @@ DROP PROCEDURE IF EXISTS db_2_0.cleanUpQuery; DELIMITER // +/** + * Drop temporary tables and warnings, existing warnings are returned in the result set. + */ CREATE PROCEDURE db_2_0.cleanUpQuery() BEGIN - SELECT * from warnings; + CREATE TEMPORARY TABLE IF NOT EXISTS warnings (warning TEXT NOT NULL); + SELECT * from warnings; - SET @pstmtstr = CONCAT('DROP TEMPORARY TABLE IF EXISTS `warnings`', IF(@tempTableList IS NULL, '', CONCAT(',',@tempTableList))); - PREPARE pstmt FROM @pstmtstr; - EXECUTE pstmt; + SET @pstmtstr = CONCAT('DROP TEMPORARY TABLE IF EXISTS `warnings`', + IF(@tempTableList IS NULL, '', CONCAT(',',@tempTableList))); + PREPARE pstmt FROM @pstmtstr; + EXECUTE pstmt; - SET @tempTableList = NULL; + SET @tempTableList = NULL; END; // DELIMITER ; diff --git a/procedures/query/createTmpTable.sql b/procedures/query/createTmpTable.sql index 180f9bab2bc27b2ada5324598dc136034ba485ab..2c342964e68fc6522962da5c046f25350c5f26b5 100644 --- a/procedures/query/createTmpTable.sql +++ b/procedures/query/createTmpTable.sql @@ -27,7 +27,10 @@ DELIMITER // CREATE PROCEDURE db_2_0.registerTempTableName(out newTableName VARCHAR(255)) BEGIN SET newTableName = md5(CONCAT(RAND(),CURRENT_TIMESTAMP())); - SET @tempTableList = IF(@tempTableList IS NULL, CONCAT('`',newTableName,'`'), CONCAT(@tempTableList, ',`', newTableName, '`')); + SET @tempTableList = IF(@tempTableList IS NULL, + CONCAT('`',newTableName,'`'), + CONCAT(@tempTableList, ',`', newTableName, '`') + ); END; // DELIMITER ; @@ -35,12 +38,23 @@ DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.createTmpTable; DELIMITER // -CREATE PROCEDURE db_2_0.createTmpTable(out newTableName VARCHAR(255)) +/** + * If not versioned: Creates a temporary table for query results with only a single `id` column. + * + * If versioned: Creates a temporary table for query results with an `id` + * column and an `_iversion` column. + */ +CREATE PROCEDURE db_2_0.createTmpTable(out newTableName VARCHAR(255), in versioned BOOLEAN) BEGIN call registerTempTableName(newTableName); - - SET @createTableStmtStr = CONCAT('CREATE TEMPORARY TABLE `', newTableName,'` ( id INT UNSIGNED PRIMARY KEY)' ); - + + IF versioned THEN + SET @createTableStmtStr = CONCAT('CREATE TEMPORARY TABLE `', newTableName, + '` ( id INT UNSIGNED, _iversion INT UNSIGNED, PRIMARY KEY (id, _iversion))' ); + ELSE + SET @createTableStmtStr = CONCAT('CREATE TEMPORARY TABLE `', newTableName,'` ( id INT UNSIGNED PRIMARY KEY)' ); + END IF; + PREPARE createTableStmt FROM @createTableStmtStr; EXECUTE createTableStmt; DEALLOCATE PREPARE createTableStmt; @@ -51,14 +65,22 @@ DELIMITER ; +/** + * Creates a temporary table for intermediate query results with three columns + * id - for entity ids (e.g. property ids or reference values) + * id2 - for entity ids (usually those entities which have the other id as property or value) + * domain - for domain ids + */ DROP PROCEDURE IF EXISTS db_2_0.createTmpTable2; DELIMITER // CREATE PROCEDURE db_2_0.createTmpTable2(out newTableName VARCHAR(255)) BEGIN call registerTempTableName(newTableName); - SET @createTableStmtStr = CONCAT('CREATE TEMPORARY TABLE `', newTableName,'` ( id INT UNSIGNED, id2 INT UNSIGNED, domain INT UNSIGNED, CONSTRAINT `', newTableName,'PK` PRIMARY KEY (id,id2,domain) )' ); - + SET @createTableStmtStr = CONCAT('CREATE TEMPORARY TABLE `', newTableName, + '` ( id INT UNSIGNED, id2 INT UNSIGNED, domain INT UNSIGNED, CONSTRAINT `', + newTableName,'PK` PRIMARY KEY (id,id2,domain) )' ); + PREPARE createTableStmt FROM @createTableStmtStr; EXECUTE createTableStmt; DEALLOCATE PREPARE createTableStmt; diff --git a/procedures/query/finishSubProperty.sql b/procedures/query/finishSubProperty.sql index 635aba4f030eab0f7e3c6f547e4d1df0b3a15584..73a9ee62c9204ae6a2a250fec25c6100a0ed44a4 100644 --- a/procedures/query/finishSubProperty.sql +++ b/procedures/query/finishSubProperty.sql @@ -24,15 +24,16 @@ DROP PROCEDURE IF EXISTS db_2_0.finishSubProperty; DELIMITER // -CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), in list VARCHAR(255)) +CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), + in list VARCHAR(255), in versioned BOOLEAN) BEGIN DECLARE data VARCHAR(20000) DEFAULT CONCAT('`',list,'`'); - SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL); + SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL, versioned); - PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr; - EXECUTE finishSubPropertyStmt; + PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr; + EXECUTE finishSubPropertyStmt; DEALLOCATE PREPARE finishSubPropertyStmt; - + SELECT @finishSubPropertyStmtStr AS finishSubPropertyStmt; END; diff --git a/procedures/query/getChildren.sql b/procedures/query/getChildren.sql index 1a61995ebd76105bb07a93ab96247f8463de1b96..0ab6784fd9e0af95046b90aa62e13d69072a0922 100644 --- a/procedures/query/getChildren.sql +++ b/procedures/query/getChildren.sql @@ -23,28 +23,64 @@ Drop Procedure if exists db_2_0.getChildren; Delimiter // -Create Procedure db_2_0.getChildren(in tableName varchar(255)) +/** + * Find and return all children of the IDs given in `tableName`. + * + * If the `versioned` parameter is `TRUE`, also all archived (non-HEAD) children are added. + */ +Create Procedure db_2_0.getChildren(in tableName varchar(255), in versioned BOOLEAN) BEGIN + DECLARE found_children INT UNSIGNED DEFAULT 0; - CREATE TEMPORARY TABLE dependTemp (id INT UNSIGNED PRIMARY KEY); - + DROP TEMPORARY TABLE IF EXISTS dependTemp; + CREATE TEMPORARY TABLE dependTemp (id INT UNSIGNED, _iversion INT UNSIGNED, PRIMARY KEY(id, _iversion)); - SET @initDepend = CONCAT('INSERT IGNORE INTO dependTemp (id) SELECT i.child FROM isa_cache AS i INNER JOIN `', tableName, '` AS t ON (i.parent=t.id);'); + SET @initDepend = CONCAT( + 'INSERT IGNORE INTO dependTemp (id, _iversion) SELECT i.child, ', + IF(versioned, + '_get_head_iversion(i.child)', + '0'), + ' FROM isa_cache AS i INNER JOIN `', + tableName, + '` AS t ON (i.parent=t.id);'); PREPARE initDependStmt FROM @initDepend; - EXECUTE initDependStmt; - IF ROW_COUNT() != 0 THEN - SET @transfer = CONCAT('INSERT IGNORE INTO `', tableName, '` (id) SELECT id FROM dependTemp'); + EXECUTE initDependStmt; + SET found_children = found_children + ROW_COUNT(); + + -- ################# VERSIONING ##################### + + IF versioned IS TRUE THEN + SET @initDepend = CONCAT( + 'INSERT IGNORE INTO dependTemp (id, _iversion) ', + 'SELECT i.child, i.child_iversion FROM archive_isa AS i INNER JOIN `', + tableName, + '` AS t ON (i.parent=t.id);'); + PREPARE initDependStmt FROM @initDepend; + + EXECUTE initDependStmt; + SET found_children = found_children + ROW_COUNT(); + END IF; + + -- ################################################## + + + IF found_children != 0 THEN + SET @transfer = CONCAT( + 'INSERT IGNORE INTO `', + tableName, + IF(versioned, + '` (id, _iversion) SELECT id, _iversion FROM dependTemp', + '` (id) SELECT id FROM dependTemp')); PREPARE transferstmt FROM @transfer; - EXECUTE transferstmt; - DEALLOCATE PREPARE transferstmt; - END IF; + EXECUTE transferstmt; + DEALLOCATE PREPARE transferstmt; + END IF; - DEALLOCATE PREPARE initDependStmt; - DROP TEMPORARY TABLE dependTemp; + DEALLOCATE PREPARE initDependStmt; END; // diff --git a/procedures/query/getDateTimeWhereClause.sql b/procedures/query/getDateTimeWhereClause.sql index 55f65ea40db84310c1a1c1ddbb7faa58ce4a9ee5..ea8155149e49f70f5661ffa10669ea25be40a937 100644 --- a/procedures/query/getDateTimeWhereClause.sql +++ b/procedures/query/getDateTimeWhereClause.sql @@ -26,18 +26,18 @@ DELIMITER // CREATE FUNCTION db_2_0.getDateTimeWhereClause(vDateTime VARCHAR(255), operator CHAR(4)) RETURNS VARCHAR(20000) DETERMINISTIC BEGIN - DECLARE sep_loc INTEGER DEFAULT LOCATE('--',vDateTime); + DECLARE sep_loc INTEGER DEFAULT LOCATE('--',vDateTime); DECLARE vDateTimeLow VARCHAR(255) DEFAULT IF(sep_loc != 0, SUBSTRING_INDEX(vDateTime, '--',1), vDateTime); DECLARE vDateTimeUpp VARCHAR(255) DEFAULT IF(sep_loc != 0, SUBSTRING_INDEX(vDateTime, '--',-1), NULL); - + DECLARE vDateTimeSecLow VARCHAR(255) DEFAULT SUBSTRING_INDEX(vDateTimeLow, 'UTC', 1); DECLARE vDateTimeNSLow VARCHAR(255) DEFAULT IF(SUBSTRING_INDEX(vDateTimeLow, 'UTC', -1)='',NULL,SUBSTRING_INDEX(vDateTimeLow, 'UTC', -1)); - + DECLARE vDateTimeSecUpp VARCHAR(255) DEFAULT IF(sep_loc != 0, SUBSTRING_INDEX(vDateTimeUpp, 'UTC', 1), NULL); DECLARE vDateTimeNSUpp VARCHAR(255) DEFAULT IF(sep_loc != 0 AND SUBSTRING_INDEX(vDateTimeUpp, 'UTC', -1)!='',SUBSTRING_INDEX(vDateTimeUpp, 'UTC', -1),NULL); - - - RETURN constructDateTimeWhereClauseForColumn("subdata.value", "subdata.value_ns", vDateTimeSecLow, vDateTimeNSLow, vDateTimeSecUpp, vDateTimeNSUpp, operator); + + + RETURN constructDateTimeWhereClauseForColumn("subdata.value", "subdata.value_ns", vDateTimeSecLow, vDateTimeNSLow, vDateTimeSecUpp, vDateTimeNSUpp, operator); END; // DELIMITER ; @@ -51,44 +51,51 @@ DELIMITER // CREATE FUNCTION db_2_0.constructDateTimeWhereClauseForColumn(seconds_col VARCHAR(255), nanos_col VARCHAR(255), vDateTimeSecLow VARCHAR(255), vDateTimeNSLow VARCHAR(255), vDateTimeSecUpp VARCHAR(255), vDateTimeNSUpp VARCHAR(255), operator CHAR(4)) RETURNS VARCHAR(20000) DETERMINISTIC BEGIN - DECLARE isInterval BOOLEAN DEFAULT vDateTimeSecUpp IS NOT NULL or vDateTimeNSUpp IS NOT NULL; + DECLARE isInterval BOOLEAN DEFAULT vDateTimeSecUpp IS NOT NULL or vDateTimeNSUpp IS NOT NULL; DECLARE operator_prefix CHAR(1) DEFAULT LEFT(operator,1); - IF isInterval THEN - IF operator = '=' THEN - RETURN " 0=1"; + IF isInterval THEN + IF operator = '=' THEN + RETURN " 0=1"; ELSEIF operator = '!=' THEN - RETURN " 0=1"; - ELSEIF operator = '>' or operator = '<=' THEN + RETURN " 0=1"; + ELSEIF operator = '>' or operator = '<=' THEN RETURN CONCAT(" ", seconds_col, operator_prefix, vDateTimeSecUpp); - ELSEIF operator = '<' or operator = '>=' THEN + ELSEIF operator = '<' or operator = '>=' THEN RETURN CONCAT(" ", seconds_col, operator_prefix, vDateTimeSecLow); - ELSEIF operator = "(" THEN + ELSEIF operator = "(" THEN RETURN CONCAT(" ", seconds_col, ">=", vDateTimeSecLow, " AND ",seconds_col, "<", vDateTimeSecUpp); - ELSEIF operator = "!(" THEN + ELSEIF operator = "!(" THEN RETURN CONCAT(" ", seconds_col, "<", vDateTimeSecLow, " OR ", seconds_col, ">=", vDateTimeSecUpp); - END IF; + END IF; ELSE IF operator = '=' THEN RETURN CONCAT(" ", - seconds_col, - "=", vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, CONCAT(' AND ', nanos_col, ' IS NULL'), CONCAT(' AND ', - nanos_col, - '=', vDateTimeNSLow))); + seconds_col, + "=", vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, CONCAT(' AND ', nanos_col, ' IS NULL'), CONCAT(' AND ', + nanos_col, + '=', vDateTimeNSLow))); ELSEIF operator = '!=' THEN RETURN CONCAT(" ", - seconds_col, - "!=", vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, '', CONCAT(' OR ', - nanos_col, - '!=', vDateTimeNSLow))); + seconds_col, + "!=", vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, '', CONCAT(' OR ', + nanos_col, + '!=', vDateTimeNSLow))); ELSEIF operator = '>' or operator = '<' THEN RETURN CONCAT(" ", - seconds_col, operator, vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, '', CONCAT(' OR (',seconds_col,'=', vDateTimeSecLow, ' AND ',nanos_col, operator, vDateTimeNSLow, ')'))); + seconds_col, operator, vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, '', CONCAT(' OR (',seconds_col,'=', vDateTimeSecLow, ' AND ',nanos_col, operator, vDateTimeNSLow, ')'))); ELSEIF operator = '>=' or operator = '<=' THEN - RETURN CONCAT(" ",seconds_col, operator, vDateTimeSecLow, IF(vDateTimeNSLow IS NULL, '', CONCAT(' AND (',seconds_col, operator_prefix, vDateTimeSecLow, ' OR ',nanos_col, operator, vDateTimeNSLow, ')'))); - ELSEIF operator = "(" THEN + RETURN CONCAT( + " ", seconds_col, operator, vDateTimeSecLow, + IF(vDateTimeNSLow IS NULL, + '', + CONCAT( + ' AND (', seconds_col, operator_prefix, vDateTimeSecLow, + ' OR ', nanos_col, operator, vDateTimeNSLow, + ' OR ', nanos_col, ' IS NULL)'))); + ELSEIF operator = "(" THEN RETURN IF(vDateTimeNSLow IS NULL,CONCAT(" ",seconds_col,"=", vDateTimeSecLow),CONCAT(" ",seconds_col,"=",vDateTimeSecLow," AND ",nanos_col,"=",vDateTimeNSLow)); - ELSEIF operator = "!(" THEN + ELSEIF operator = "!(" THEN RETURN IF(vDateTimeNSLow IS NULL,CONCAT(" ",seconds_col,"!=",vDateTimeSecLow, ""),CONCAT(" ",seconds_col,"!=",vDateTimeSecLow," OR ",nanos_col, " IS NULL OR ", nanos_col, "!=",vDateTimeNSLow)); END IF; END IF; @@ -105,22 +112,27 @@ DELIMITER // CREATE FUNCTION db_2_0.getDateWhereClause(vDateTimeDotNotation VARCHAR(255), operator CHAR(4)) RETURNS VARCHAR(20000) DETERMINISTIC BEGIN - DECLARE isInterval INTEGER DEFAULT LOCATE('--',vDateTimeDotNotation); - DECLARE vILB VARCHAR(255) DEFAULT IF(isInterval != 0, SUBSTRING_INDEX(vDateTimeDotNotation, '--', 1), vDateTimeDotNotation); - DECLARE vEUB VARCHAR(255) DEFAULT IF(isInterval != 0, SUBSTRING_INDEX(vDateTimeDotNotation, '--', -1), NULL); - DECLARE vILB_Date INTEGER DEFAULT SUBSTRING_INDEX(vILB, '.', 1); - DECLARE vEUB_Date INTEGER DEFAULT SUBSTRING_INDEX(vEUB, '.', 1); + DECLARE isInterval INTEGER DEFAULT LOCATE('--',vDateTimeDotNotation); + -- ILB is short for Inclusive Lower Boundary + DECLARE vILB VARCHAR(255) DEFAULT IF(isInterval != 0, SUBSTRING_INDEX(vDateTimeDotNotation, '--', 1), vDateTimeDotNotation); + -- EUB is short for Exclusive Upper Boundary + DECLARE vEUB VARCHAR(255) DEFAULT IF(isInterval != 0, SUBSTRING_INDEX(vDateTimeDotNotation, '--', -1), NULL); + DECLARE vILB_Date INTEGER DEFAULT SUBSTRING_INDEX(vILB, '.', 1); + DECLARE vEUB_Date INTEGER DEFAULT SUBSTRING_INDEX(vEUB, '.', 1); + -- hasTime is actually hasNotTime DECLARE hasTime INTEGER DEFAULT LOCATE('.NULL.NULL',vILB); + -- Day of Month (0-31, 0 means any) DECLARE dom INTEGER DEFAULT vILB_Date % 100; - DECLARE mon INTEGER DEFAULT ((vILB_Date % 10000) - dom) / 100; - DECLARE yea INTEGER DEFAULT (vILB_Date - (vILB_Date%10000)) / 10000; - SELECT vILB_Date != vEUB_Date INTO isInterval; + -- Month (0-12, 0 means any) + DECLARE mon INTEGER DEFAULT ((vILB_Date % 10000) - dom) / 100; + -- Year + DECLARE yea INTEGER DEFAULT (vILB_Date - (vILB_Date % 10000)) / 10000; IF operator = '=' and hasTime != 0 THEN RETURN CONCAT(" subdata.value=", vILB_Date); ELSEIF operator = "!=" and hasTime != 0 THEN IF mon != 0 and dom != 0 THEN - RETURN CONCAT(" subdata.value!=", vILB_Date, " and subdata.value%100!=0"); + RETURN CONCAT(" subdata.value!=", vILB_Date, " and subdata.value%100!=0"); ELSEIF mon != 0 THEN RETURN CONCAT(" subdata.value!=", vILB_Date, " and subdata.value%100=0 and subdata.value%10000!=0"); ELSE @@ -161,6 +173,32 @@ BEGIN ELSE RETURN CONCAT(" subdata.value>=",vEUB_Date); END IF; + ELSEIF operator = "<=" THEN + IF mon != 0 and dom != 0 THEN + -- Full date YYYY-MM-DD + RETURN CONCAT(" subdata.value<=", vILB_Date, + " or (subdata.value<=", yea*10000 + mon*100, " and subdata.value%100=0)"); + ELSEIF mon != 0 THEN + -- Date is fragment YYYY-MM + RETURN CONCAT(" subdata.value<", vEUB_Date); + ELSE + -- Date is fragment YYYY + RETURN CONCAT(" subdata.value<", vEUB_Date); + END IF; + ELSEIF operator = ">=" THEN + IF mon != 0 and dom != 0 THEN + -- Full date YYYY-MM-DD + RETURN CONCAT(" subdata.value>=", vILB_Date, + " or (subdata.value>=", yea*10000 + mon*100, " and subdata.value%100=0)", + " or (subdata.value>=", yea*10000, " and subdata.value%10000=0)"); + ELSEIF mon != 0 THEN + -- Date is fragment YYYY-MM + RETURN CONCAT(" subdata.value>=", yea*10000 + mon*100, + " or (subdata.value>=", yea*10000, " and subdata.value%10000=0)"); + ELSE + -- Date is fragment YYYY + RETURN CONCAT(" subdata.value>=", yea*10000); + END IF; END IF; return ' 0=1'; diff --git a/procedures/query/initBackReference.sql b/procedures/query/initBackReference.sql index 47038ad4c13fc934e0d9820eed27028ff848e9cb..63fa9292a71688a7a53f8851bb5a375e1aa76fe0 100644 --- a/procedures/query/initBackReference.sql +++ b/procedures/query/initBackReference.sql @@ -25,20 +25,22 @@ DROP PROCEDURE IF EXISTS db_2_0.initBackReference; DELIMITER // CREATE PROCEDURE db_2_0.initBackReference(in pid INT UNSIGNED, in pname VARCHAR(255), in entity_id INT UNSIGNED, in ename VARCHAR(255)) BEGIN - DECLARE propertiesTable VARCHAR(255) DEFAULT NULL; - DECLARE entitiesTable VARCHAR(255) DEFAULT NULL; + DECLARE propertiesTable VARCHAR(255) DEFAULT NULL; + DECLARE entitiesTable VARCHAR(255) DEFAULT NULL; IF pname IS NOT NULL THEN - call createTmpTable(propertiesTable); + -- TODO versioning for properties + call createTmpTable(propertiesTable, FALSE); call initSubEntity(pid, pname, propertiesTable); END IF; IF ename IS NOT NULL THEN - call createTmpTable(entitiesTable); + -- TODO versioning for referencing entities + call createTmpTable(entitiesTable, FALSE); call initSubEntity(entity_id, ename, entitiesTable); END IF; - SELECT propertiesTable, entitiesTable; + SELECT propertiesTable, entitiesTable; END // diff --git a/procedures/query/initDisjunctionFilter.sql b/procedures/query/initDisjunctionFilter.sql index 7a5a45bd125563b847d69ca404d0c28294c64fc6..be7a0ebad9d3f9b278a4ea7de5418ade1b627f31 100644 --- a/procedures/query/initDisjunctionFilter.sql +++ b/procedures/query/initDisjunctionFilter.sql @@ -26,7 +26,7 @@ DROP PROCEDURE IF EXISTS db_2_0.initEmptyTargetSet; DELIMITER // -CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255)) +CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255), in versioned BOOLEAN) BEGIN DECLARE newTableName VARCHAR(255) DEFAULT targetSet; IF targetSet IS NOT NULL THEN @@ -36,10 +36,10 @@ BEGIN EXECUTE stmtIsNotEmpty; DEALLOCATE PREPARE stmtIsNotEmpty; IF @isNotEmptyVar IS NOT NULL THEN /*if targetSet is not empty*/ - call createTmpTable(newTableName); + call createTmpTable(newTableName, versioned); END IF; ELSE - call createTmpTable(newTableName); + call createTmpTable(newTableName, versioned); END IF; SELECT newTableName AS newTableName; END; @@ -49,49 +49,9 @@ DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.initDisjunctionFilter; DELIMITER // -CREATE PROCEDURE db_2_0.initDisjunctionFilter() +CREATE PROCEDURE db_2_0.initDisjunctionFilter(in versioned BOOLEAN) BEGIN - call initEmptyTargetSet(NULL); + call initEmptyTargetSet(NULL, versioned); END; // DELIMITER ; - -DROP PROCEDURE IF EXISTS db_2_0.initNegationFilter; -DELIMITER // - -CREATE PROCEDURE db_2_0.initNegationFilter(in sourceSet VARCHAR(255)) -BEGIN - DECLARE newTableName VARCHAR(255) DEFAULT NULL; - call createTmpTable(newTableName); - call copyTable(sourceSet, newTableName); - SELECT newTableName AS newTableName; -END; -// -DELIMITER ; - -DROP PROCEDURE IF EXISTS db_2_0.initConjunctionFilter; -DELIMITER // - -CREATE PROCEDURE db_2_0.initConjunctionFilter(in sourceSet VARCHAR(255)) -BEGIN - DECLARE newTableName VARCHAR(255) DEFAULT NULL; - call createTmpTable(newTableName); - call copyTable(sourceSet, newTableName); - SELECT newTableName AS newTableName; -END; -// -DELIMITER ; - -DROP PROCEDURE IF EXISTS db_2_0.finishNegationFilter; -DELIMITER // - -CREATE PROCEDURE db_2_0.finishNegationFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in subResultSet VARCHAR(255)) -BEGIN - IF targetSet IS NULL OR sourceSet = targetSet THEN - call calcDifference(sourceSet, subResultSet); - ELSE - call calcComplementUnion(targetSet,subResultSet,sourceSet); - END IF; -END; -// -DELIMITER ; diff --git a/procedures/query/initEntity.sql b/procedures/query/initEntity.sql index f8877303a6d47a3cbf620b45c2fd8484caa1804b..b96b30dfbc1110575bac7bf4eacf16e95fa65b83 100644 --- a/procedures/query/initEntity.sql +++ b/procedures/query/initEntity.sql @@ -24,29 +24,44 @@ DROP PROCEDURE IF EXISTS db_2_0.initEntity; DELIMITER // -CREATE PROCEDURE db_2_0.initEntity(in eid INT UNSIGNED, in ename VARCHAR(255), in enameLike VARCHAR(255), in enameRegexp VARCHAR(255), in resultset VARCHAR(255)) +/** + * Insert the specified (by `ename`, `enameLike`, `enameRegexp` or `eid`) Entities into `resultset`. + * + * If `versioned` is `TRUE`, also add archived entities (for example if the name was changed in the + * past). + */ +CREATE PROCEDURE db_2_0.initEntity(in eid INT UNSIGNED, in ename VARCHAR(255), + in enameLike VARCHAR(255), in enameRegexp VARCHAR(255), + in resultset VARCHAR(255), in versioned BOOLEAN) initEntityLabel: BEGIN + DECLARE select_columns VARCHAR(255) DEFAULT '` (id) SELECT entity_id FROM name_data '; SET @initEntityStmtStr = NULL; -- Prepare a statement which resolves the name or pattern to ids. The ids -- are collected in a temporary table (resultset). + IF versioned IS TRUE THEN + SET select_columns = '` (id, _iversion) SELECT entity_id, _get_head_iversion(entity_id) FROM name_data '; + END IF; IF ename IS NOT NULL THEN SET @initEntityStmtStr = CONCAT( 'INSERT IGNORE INTO `', resultset, - '` (id) SELECT entity_id FROM name_data WHERE value=?; '); + select_columns, + 'WHERE value=?; '); SET @query_param = ename; ELSEIF enameLike IS NOT NULL THEN SET @initEntityStmtStr = CONCAT( 'INSERT IGNORE INTO `', resultset, - '` (id) SELECT entity_id FROM name_data WHERE value LIKE ?;'); + select_columns, + 'WHERE value LIKE ?;'); SET @query_param = enameLike; ELSEIF enameRegexp IS NOT NULL THEN SET @initEntityStmtStr = CONCAT( 'INSERT IGNORE INTO `', resultset, - '` (id) SELECT entity_id FROM name_data WHERE value REGEXP ?;'); + select_columns, + 'WHERE value REGEXP ?;'); SET @query_param = enameRegexp; END IF; @@ -58,15 +73,58 @@ initEntityLabel: BEGIN END IF; IF eid IS NOT NULL THEN - SET @initEntityStmtStr = CONCAT('INSERT IGNORE INTO `',resultset,'` (id) SELECT id FROM entities WHERE id=',eid,';'); + -- add an explicitely given id to the resultset (if it exists) + SET @initEntityStmtStr = CONCAT( + 'INSERT IGNORE INTO `', + resultset, + IF(versioned, + '` (id, _iversion) SELECT id, _get_head_iversion(id) ', + '` (id) SELECT id '), + 'FROM entities WHERE id=',eid,';'); PREPARE initEntityStmt FROM @initEntityStmtStr; EXECUTE initEntityStmt; DEALLOCATE PREPARE initEntityStmt; END IF; + -- ################# VERSIONING ##################### + -- Same as above, but from `archive_name_data` instead of `name_data`. + IF versioned IS TRUE THEN + SET select_columns = '` (id, _iversion) SELECT entity_id, _iversion FROM archive_name_data '; + IF ename IS NOT NULL THEN + SET @initEntityStmtStr = CONCAT( + 'INSERT IGNORE INTO `', + resultset, + select_columns, + 'WHERE value=?; '); + SET @query_param = ename; + ELSEIF enameLike IS NOT NULL THEN + SET @initEntityStmtStr = CONCAT( + 'INSERT IGNORE INTO `', + resultset, + select_columns, + 'WHERE value LIKE ?;'); + SET @query_param = enameLike; + ELSEIF enameRegexp IS NOT NULL THEN + SET @initEntityStmtStr = CONCAT( + 'INSERT IGNORE INTO `', + resultset, + 'WHERE value REGEXP ?;'); + SET @query_param = enameRegexp; + END IF; + + -- execute the statement + IF @initEntityStmtStr IS NOT NULL THEN + PREPARE initEntityStmt FROM @initEntityStmtStr; + EXECUTE initEntityStmt USING @query_param; + DEALLOCATE PREPARE initEntityStmt; + END IF; + END IF; + -- ################################################## + + IF @initEntityStmtStr IS NOT NULL THEN - call getChildren(resultset); + call getChildren(resultset, versioned); END IF; END; diff --git a/procedures/query/initPOV.sql b/procedures/query/initPOV.sql index d1fa16300e4ef36902fd702739e389d336f1b3f5..0d7dea3dd4b140e519a2a0c06ca9842980044ba2 100644 --- a/procedures/query/initPOV.sql +++ b/procedures/query/initPOV.sql @@ -29,7 +29,7 @@ CREATE PROCEDURE db_2_0.initPOVPropertiesTable(in pid INT UNSIGNED, in pname VAR BEGIN DECLARE propertiesTable VARCHAR(255) DEFAULT NULL; /*table for property ids*/ DECLARE replTbl VARCHAR(255) DEFAULT NULL; - DECLARE ecount INT DEFAULT 0; + DECLARE ecount INT DEFAULT 0; DECLARE t1 BIGINT DEFAULT 0; DECLARE t2 BIGINT DEFAULT 0; DECLARE t3 BIGINT DEFAULT 0; @@ -62,9 +62,10 @@ BEGIN -- expand with all children SELECT conv( concat( substring(uid,16,3), substring(uid,10,4), substring(uid,1,8)),16,10) div 10000 - (141427 * 24 * 60 * 60 * 1000) as current_mills INTO t3 from (select uuid() uid) as alias; IF ecount > 0 THEN - call getChildren(propertiesTable); + -- TODO versioned queries + call getChildren(propertiesTable, False); END IF; - + -- expand with all replacements SELECT conv( concat( substring(uid,16,3), substring(uid,10,4), substring(uid,1,8)),16,10) div 10000 - (141427 * 24 * 60 * 60 * 1000) as current_mills INTO t4 from (select uuid() uid) as alias; IF ecount > 0 THEN @@ -93,10 +94,11 @@ DROP PROCEDURE IF EXISTS db_2_0.initPOVRefidsTable // CREATE PROCEDURE db_2_0.initPOVRefidsTable(in vInt INT UNSIGNED, in vText VARCHAR(255)) BEGIN DECLARE refIdsTable VARCHAR(255) DEFAULT NULL; /*table for referenced entity ids*/ - + #-- for reference properties: the value is interpreted as a record type name. IF vText IS NOT NULL THEN - call createTmpTable(refIdsTable); + -- TODO versioned queries + call createTmpTable(refIdsTable, FALSE); call initSubEntity(vInt, vText, refIdsTable); #-- now, all ids are in the refIdsTable END IF; diff --git a/procedures/query/initQuery.sql b/procedures/query/initQuery.sql index b233972d2ca7bb72aab768ef5be300273f5ec382..37653a36624a7995ca74eee7030b5f795ad8908e 100644 --- a/procedures/query/initQuery.sql +++ b/procedures/query/initQuery.sql @@ -32,11 +32,11 @@ DROP PROCEDURE IF EXISTS db_2_0.initQuery; DELIMITER // -CREATE PROCEDURE db_2_0.initQuery() +CREATE PROCEDURE db_2_0.initQuery(in versioned BOOLEAN) BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS warnings (warning TEXT NOT NULL); - - call createTmpTable(@resultSet); + + call createTmpTable(@resultSet, versioned); SELECT @resultSet as tablename; END; diff --git a/procedures/query/initSubEntity.sql b/procedures/query/initSubEntity.sql index 543a0ce0f4745561ad0fa489da580d5e30fc3267..3cb31aa2c9d7e8fcc4bf8de26bc726862044e1fc 100644 --- a/procedures/query/initSubEntity.sql +++ b/procedures/query/initSubEntity.sql @@ -56,7 +56,8 @@ BEGIN END IF; IF ecount > 0 THEN - call getChildren(tableName); + -- TODO versioning + call getChildren(tableName, False); END IF; END; diff --git a/procedures/query/makeStmt.sql b/procedures/query/makeStmt.sql index 7ef80bfb9db6a0026642f6cc64eeaf560b9fbfe8..f6d6ab743a7ee5ef10b383f5e88716d1c2dc0f40 100644 --- a/procedures/query/makeStmt.sql +++ b/procedures/query/makeStmt.sql @@ -23,16 +23,53 @@ DROP FUNCTION IF EXISTS db_2_0.makeStmt; DELIMITER // -CREATE FUNCTION db_2_0.makeStmt(sourceSet VARCHAR(255), targetSet VARCHAR(255), data VARCHAR(20000), properties VARCHAR(20000)) RETURNS VARCHAR(20000) NO SQL -BEGIN - +/** + * Create and return a statement string which generalizes the source -> target procedure. + * + * Parameters + * ---------- + * + * sourceSet : table + * The source table. + * + * targetSet : table + * The table into which the results shall be copied. If `NULL`, delete all non-matching rows from + * `sourceSet`. + * + * data : table + * Table whose IDs are a whitelist for which IDs shall be copied from `sourceSet` to `targetSet`. + * + * properties : table + * Table with a whitelist of properties. If not `NULL`, the `property_id` of `data` must be an ID + * in `properties`. + * TODO Add documentation about the `id2` meaning of `properties`. + * + * versiones : boolean + * If `True` and if `sourceSet` is the `entities` table, the ID and version are copied directly from + * `data` to `targetSet`, which must not be `NULL`. Property filtering is done as usual. + */ +CREATE FUNCTION db_2_0.makeStmt(sourceSet VARCHAR(255), targetSet VARCHAR(255), data VARCHAR(20000), + properties VARCHAR(20000), versioned BOOLEAN) +RETURNS VARCHAR(20000) NO SQL +BEGIN + IF sourceSet = "entities" AND versioned THEN + RETURN CONCAT('INSERT IGNORE INTO `', + targetSet, + '` (id, _iversion) SELECT entity_id, _iversion FROM ', + data, + IF(properties IS NULL, '', + CONCAT(' AS data JOIN `', properties, '` AS prop ON (data.property_id = prop.id) WHERE ', + 'data.entity_id = prop.id2 OR prop.id2 = 0'))); + END IF; RETURN CONCAT( IF(targetSet IS NULL, CONCAT('DELETE FROM `',sourceSet,'` WHERE NOT EXISTS (SELECT 1 FROM '), - CONCAT('INSERT IGNORE INTO `',targetSet,'` (id) SELECT id FROM `',sourceSet,'` WHERE EXISTS (SELECT 1 FROM ')), + CONCAT('INSERT IGNORE INTO `',targetSet,'` (id) SELECT id FROM `',sourceSet,'` ', + 'WHERE EXISTS (SELECT 1 FROM ')), IF(properties IS NULL, CONCAT(data,' as data WHERE '), - CONCAT('`',properties,'` as prop JOIN ',data,' as data ON (data.property_id=prop.id) WHERE (data.entity_id=prop.id2 OR prop.id2=0) AND ')), + CONCAT('`',properties,'` as prop JOIN ',data,' as data ON (data.property_id=prop.id) WHERE ', + '(data.entity_id=prop.id2 OR prop.id2=0) AND ')), 'data.entity_id=`', sourceSet, '`.`id` LIMIT 1)' ); diff --git a/procedures/retrieveEntity.sql b/procedures/retrieveEntity.sql index 3d5d219c58e73d8e82a019abb7d089ef2e6bcc11..f6764ae4a579d54bcc74ec51bd0adadbe3d63528 100644 --- a/procedures/retrieveEntity.sql +++ b/procedures/retrieveEntity.sql @@ -43,6 +43,10 @@ drop procedure if exists db_2_0.retrieveEntity // * `HEAD` for the latest version or as `HEAD~n`, which retrieves the n-th * ancestor of `HEAD`. * + * ResultSet + * --------- + * Tuple of (Datatype, Collection, EntityID, EntityName, EntityDesc, + * EntityRole, FileSize, FilePath, FileHash, ACL, Version) */ create procedure db_2_0.retrieveEntity( in EntityID INT UNSIGNED, @@ -56,8 +60,6 @@ retrieveEntityBody: BEGIN DECLARE FileStorageId VARBINARY(65525) DEFAULT NULL; DECLARE DatatypeID INT UNSIGNED DEFAULT NULL; DECLARE CollectionName VARCHAR(255) DEFAULT NULL; - DECLARE VersionSeconds BIGINT UNSIGNED DEFAULT NULL; - DECLARE VersionNanos INT(10) UNSIGNED DEFAULT NULL; DECLARE IsHead BOOLEAN DEFAULT TRUE; DECLARE IVersion INT UNSIGNED DEFAULT NULL; @@ -73,14 +75,6 @@ retrieveEntityBody: BEGIN SELECT get_head_version(EntityID) = Version INTO IsHead; END IF; - SELECT t.seconds, t.nanos - INTO VersionSeconds, VersionNanos - FROM entity_version AS e - INNER JOIN transactions AS t - ON ( e.srid = t.srid ) - WHERE e.entity_id = EntityID - AND e.version = Version; - IF IsHead IS FALSE THEN SET IVersion=get_iversion(EntityID, Version); @@ -142,9 +136,7 @@ retrieveEntityBody: BEGIN FileStorage as FileStorage, FileStorageId as FileStorageId, (SELECT acl FROM entity_acl AS a WHERE a.id = e.acl) AS ACL, - Version AS Version, - VersionSeconds AS VersionSeconds, - VersionNanos AS VersionNanos + Version AS Version FROM archive_entities AS e WHERE e.id = EntityID AND e._iversion = IVersion @@ -196,9 +188,7 @@ retrieveEntityBody: BEGIN FileStorage as FileStorage, FileStorageId as FileStorageId, (SELECT acl FROM entity_acl AS a WHERE a.id = e.acl) AS ACL, - Version AS Version, - VersionSeconds AS VersionSeconds, - VersionNanos AS VersionNanos + Version AS Version FROM entities e WHERE id = EntityID LIMIT 1; END; // diff --git a/procedures/retrieveEntityOverrides.sql b/procedures/retrieveEntityOverrides.sql index fa43d6b3e216cdc25798261a8753daa656cf8618..2f6b36da256fc4ece42daca4957d85ea463cfd2e 100644 --- a/procedures/retrieveEntityOverrides.sql +++ b/procedures/retrieveEntityOverrides.sql @@ -91,13 +91,11 @@ retrieveOverridesBody: BEGIN NULL AS collection_override, NULL AS name_override, NULL AS desc_override, - ( SELECT value FROM - ( SELECT value FROM name_data - WHERE domain_id = 0 - AND entity_ID = datatypeID - AND property_id = 20 - UNION SELECT datatype AS value - ) AS tmp LIMIT 1 ) AS type_override, + IFNULL((SELECT value FROM name_data + WHERE domain_id = 0 + AND entity_id = datatype + AND property_id = 20 + LIMIT 1), datatype) AS type_override, entity_id, property_id FROM archive_data_type @@ -154,10 +152,10 @@ retrieveOverridesBody: BEGIN NULL AS collection_override, NULL AS name_override, NULL AS desc_override, - ( SELECT value FROM name_data + IFNULL((SELECT value FROM name_data WHERE domain_id = 0 AND entity_ID = datatype - AND property_id = 20 LIMIT 1 ) AS type_override, + AND property_id = 20 LIMIT 1), datatype) AS type_override, entity_id, property_id FROM data_type diff --git a/procedures/retrieveEntityParents.sql b/procedures/retrieveEntityParents.sql index 16466fc991693766c1bfded1acdeec453e2cd655..8303f872d5902a91e767df4a3b1e1461860e3fee 100644 --- a/procedures/retrieveEntityParents.sql +++ b/procedures/retrieveEntityParents.sql @@ -78,18 +78,24 @@ retrieveEntityParentsBody: BEGIN SELECT i.parent AS ParentID, - ( SELECT value FROM archive_name_data + ( SELECT value FROM name_data WHERE domain_id = 0 AND entity_id = ParentID AND property_id = 20 - AND _iversion = IVersion) AS ParentName, + ) AS ParentName, -- This is not necessarily the name of the parent at the time of + -- IVersion but it is a good guess. Future implementations of the + -- archive_isa table should also store the IVersion of the + -- parents. Only then the historically correct ParentName can be + -- reconstructed. e.description AS ParentDescription, e.role AS ParentRole, (SELECT acl FROM entity_acl AS a WHERE a.id = e.acl) AS ACL FROM archive_isa AS i JOIN entities AS e ON (i.parent = e.id) WHERE i.child = EntityID - AND i.child_iversion = IVersion; + AND i.child_iversion = IVersion + AND i.direct IS TRUE + ; LEAVE retrieveEntityParentsBody; END IF; diff --git a/tests/test_autotap.sql b/tests/test_autotap.sql new file mode 100644 index 0000000000000000000000000000000000000000..6345bf004944747489a7879b4180c75d3020f351 --- /dev/null +++ b/tests/test_autotap.sql @@ -0,0 +1,2908 @@ +-- *************************************************************** +-- myTAP Testing Script +-- ==================== +-- Generated: 2020-02-04 +-- This database testing script has been created by the autotap +-- utility. The tests generated are in the TAP format for use with +-- myTAP and are based on the current state of schema objects, +-- with the database assumed to be in a known good state. All tests +-- will pass but that does not guarantee the correctness of the +-- state represented by the tests. +-- +-- After the script is generated, any subsequent DDL changes, +-- whether additions, deletions or modifications, will cause some +-- of the tests to fail. This is intentional. +-- +-- The purpose of the utility is to assist the process of +-- retrofitting testing to existing projects. You should still check +-- that the schema state represents what you intend and you should +-- modify this script by hand to account for all subsequent changes. +-- *************************************************************** + + +-- *************************************************************** +-- SCHEMA _caosdb_schema_unit_tests +-- *************************************************************** + +USE tap; +BEGIN; +CALL tap.no_plan(); +SELECT tap.has_schema('_caosdb_schema_unit_tests',''); + +-- *************************************************************** +-- TABLES +-- *************************************************************** + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.archive_isa +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','archive_isa',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','archive_isa','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','archive_isa','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','archive_isa','`child`,`child_iversion`,`parent`,`direct`',''); + +-- COLUMN archive_isa.child + +SELECT tap.has_column('_caosdb_schema_unit_tests','archive_isa','child',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','archive_isa','child','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','archive_isa','child','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','archive_isa','child',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','archive_isa','child',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','archive_isa','child',NULL,''); + +-- COLUMN archive_isa.child_iversion + +SELECT tap.has_column('_caosdb_schema_unit_tests','archive_isa','child_iversion',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','archive_isa','child_iversion','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','archive_isa','child_iversion','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','archive_isa','child_iversion',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','archive_isa','child_iversion',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','archive_isa','child_iversion',NULL,''); + +-- COLUMN archive_isa.parent + +SELECT tap.has_column('_caosdb_schema_unit_tests','archive_isa','parent',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','archive_isa','parent','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','archive_isa','parent','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','archive_isa','parent',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','archive_isa','parent',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','archive_isa','parent',NULL,''); + +-- COLUMN archive_isa.direct + +SELECT tap.has_column('_caosdb_schema_unit_tests','archive_isa','direct',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','archive_isa','direct','tinyint(1)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','archive_isa','direct','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','archive_isa','direct',1,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','archive_isa','direct',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','archive_isa','direct',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','archive_isa','`parent`,`child`',''); + +-- INDEX archive_isa.child + +SELECT tap.has_index('_caosdb_schema_unit_tests','archive_isa','child',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','archive_isa','child','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','archive_isa','`child`,`child_iversion`',''); + +-- INDEX archive_isa.parent + +SELECT tap.has_index('_caosdb_schema_unit_tests','archive_isa','parent',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','archive_isa','parent','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','archive_isa','`parent`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','archive_isa','`archive_isa_ibfk_1`,`archive_isa_ibfk_2`',''); + +-- CONSTRAINT archive_isa.archive_isa_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_1','CASCADE',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_1','RESTRICT',''); + +-- CONSTRAINT archive_isa.archive_isa_ibfk_2 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_2',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_2','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_2','CASCADE',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','archive_isa','archive_isa_ibfk_2','RESTRICT',''); +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.collection_type +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','collection_type',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','collection_type','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','collection_type','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','collection_type','`domain_id`,`entity_id`,`property_id`,`collection`',''); + +-- COLUMN collection_type.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','collection_type','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','collection_type','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','collection_type','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','collection_type','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','collection_type','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','collection_type','domain_id',NULL,''); + +-- COLUMN collection_type.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','collection_type','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','collection_type','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','collection_type','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','collection_type','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','collection_type','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','collection_type','entity_id',NULL,''); + +-- COLUMN collection_type.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','collection_type','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','collection_type','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','collection_type','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','collection_type','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','collection_type','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','collection_type','property_id',NULL,''); + +-- COLUMN collection_type.collection + +SELECT tap.has_column('_caosdb_schema_unit_tests','collection_type','collection',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','collection_type','collection','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','collection_type','collection','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','collection_type','collection',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','collection_type','collection','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','collection_type','collection','utf8_unicode_ci',''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','collection_type','`domain_id`,`entity_id`,`property_id`',''); + +-- INDEX collection_type.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','collection_type','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','collection_type','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','collection_type','`domain_id`,`entity_id`',''); + +-- INDEX collection_type.entity_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','collection_type','entity_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','collection_type','entity_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','collection_type','`entity_id`',''); + +-- INDEX collection_type.property_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','collection_type','property_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','collection_type','property_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','collection_type','`property_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','collection_type','`collection_type-d-e-p`,`collection_type_domain_id_entity`,`collection_type_entity_id_entity`,`collection_type_property_id_entity`',''); + +-- CONSTRAINT collection_type.collection_type_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','collection_type','collection_type_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','collection_type','collection_type_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','collection_type','collection_type_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','collection_type','collection_type_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT collection_type.collection_type_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','collection_type','collection_type_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','collection_type','collection_type_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','collection_type','collection_type_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','collection_type','collection_type_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT collection_type.collection_type_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','collection_type','collection_type_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','collection_type','collection_type_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','collection_type','collection_type_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','collection_type','collection_type_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.data_type +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','data_type',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','data_type','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','data_type','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','data_type','`domain_id`,`entity_id`,`property_id`,`datatype`',''); + +-- COLUMN data_type.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','data_type','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','data_type','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','data_type','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','data_type','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','data_type','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','data_type','domain_id',NULL,''); + +-- COLUMN data_type.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','data_type','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','data_type','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','data_type','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','data_type','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','data_type','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','data_type','entity_id',NULL,''); + +-- COLUMN data_type.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','data_type','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','data_type','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','data_type','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','data_type','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','data_type','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','data_type','property_id',NULL,''); + +-- COLUMN data_type.datatype + +SELECT tap.has_column('_caosdb_schema_unit_tests','data_type','datatype',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','data_type','datatype','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','data_type','datatype','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','data_type','datatype',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','data_type','datatype',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','data_type','datatype',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','data_type','`name_ov_dom_ent_idx`',''); + +-- INDEX data_type.name_ov_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','data_type','name_ov_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','data_type','name_ov_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','data_type','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','data_type','`datatype_ukey`,`datatype_forkey_dom`,`datatype_forkey_ent`,`datatype_forkey_pro`,`datatype_forkey_type`',''); + +-- CONSTRAINT data_type.datatype_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','data_type','datatype_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','data_type','datatype_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','data_type','datatype_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','data_type','datatype_forkey_dom','RESTRICT',''); + +-- CONSTRAINT data_type.datatype_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','data_type','datatype_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','data_type','datatype_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','data_type','datatype_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','data_type','datatype_forkey_ent','RESTRICT',''); + +-- CONSTRAINT data_type.datatype_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','data_type','datatype_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','data_type','datatype_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','data_type','datatype_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','data_type','datatype_forkey_pro','RESTRICT',''); + +-- CONSTRAINT data_type.datatype_forkey_type + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','data_type','datatype_forkey_type',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','data_type','datatype_forkey_type','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','data_type','datatype_forkey_type','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','data_type','datatype_forkey_type','RESTRICT',''); + +-- CONSTRAINT data_type.datatype_ukey + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','data_type','datatype_ukey',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','data_type','datatype_ukey','UNIQUE',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.date_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','date_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','date_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','date_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','date_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`',''); + +-- COLUMN date_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','domain_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','domain_id',NULL,''); + +-- COLUMN date_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','entity_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','entity_id',NULL,''); + +-- COLUMN date_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','property_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','property_id',NULL,''); + +-- COLUMN date_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','value','int(11)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','value',NULL,''); + +-- COLUMN date_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','status','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','status','utf8_unicode_ci',''); + +-- COLUMN date_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','date_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','date_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','date_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','date_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','date_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','date_data','pidx',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','date_data','`date_data_dom_ent_idx`',''); + +-- INDEX date_data.date_data_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','date_data','date_data_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','date_data','date_data_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','date_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','date_data','`date_ov_forkey_dom`,`date_ov_forkey_ent`,`date_ov_forkey_pro`',''); + +-- CONSTRAINT date_data.date_ov_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','date_data','date_ov_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','date_data','date_ov_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','date_data','date_ov_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','date_data','date_ov_forkey_dom','RESTRICT',''); + +-- CONSTRAINT date_data.date_ov_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','date_data','date_ov_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','date_data','date_ov_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','date_data','date_ov_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','date_data','date_ov_forkey_ent','RESTRICT',''); + +-- CONSTRAINT date_data.date_ov_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','date_data','date_ov_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','date_data','date_ov_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','date_data','date_ov_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','date_data','date_ov_forkey_pro','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.datetime_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','datetime_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','datetime_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','datetime_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','datetime_data','`domain_id`,`entity_id`,`property_id`,`status`,`pidx`,`value_ns`,`value`',''); + +-- COLUMN datetime_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','domain_id',NULL,''); + +-- COLUMN datetime_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','entity_id',NULL,''); + +-- COLUMN datetime_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','property_id',NULL,''); + +-- COLUMN datetime_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','status','utf8_unicode_ci',''); + +-- COLUMN datetime_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','pidx',NULL,''); + +-- COLUMN datetime_data.value_ns + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','value_ns',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','value_ns','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','value_ns','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','value_ns','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','value_ns',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','value_ns',NULL,''); + +-- COLUMN datetime_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','datetime_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','datetime_data','value','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','datetime_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','datetime_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','datetime_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','datetime_data','value',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','datetime_data','`domain_id`',''); + +-- INDEX datetime_data.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','datetime_data','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','datetime_data','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','datetime_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','datetime_data','`dat_domain_id_entity`,`dat_entity_id_entity`,`dat_property_id_entity`',''); + +-- CONSTRAINT datetime_data.dat_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','datetime_data','dat_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','datetime_data','dat_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','datetime_data','dat_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','datetime_data','dat_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT datetime_data.dat_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','datetime_data','dat_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','datetime_data','dat_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','datetime_data','dat_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','datetime_data','dat_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT datetime_data.dat_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','datetime_data','dat_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','datetime_data','dat_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','datetime_data','dat_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','datetime_data','dat_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.desc_overrides +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','desc_overrides',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','desc_overrides','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','desc_overrides','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','desc_overrides','`domain_id`,`entity_id`,`property_id`,`description`',''); + +-- COLUMN desc_overrides.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','desc_overrides','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','desc_overrides','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','desc_overrides','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','desc_overrides','domain_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','desc_overrides','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','desc_overrides','domain_id',NULL,''); + +-- COLUMN desc_overrides.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','desc_overrides','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','desc_overrides','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','desc_overrides','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','desc_overrides','entity_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','desc_overrides','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','desc_overrides','entity_id',NULL,''); + +-- COLUMN desc_overrides.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','desc_overrides','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','desc_overrides','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','desc_overrides','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','desc_overrides','property_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','desc_overrides','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','desc_overrides','property_id',NULL,''); + +-- COLUMN desc_overrides.description + +SELECT tap.has_column('_caosdb_schema_unit_tests','desc_overrides','description',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','desc_overrides','description','text',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','desc_overrides','description','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','desc_overrides','description','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','desc_overrides','description','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','desc_overrides','description','utf8_unicode_ci',''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','desc_overrides','`desc_ov_dom_ent_idx`',''); + +-- INDEX desc_overrides.desc_ov_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','desc_overrides','desc_ov_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','desc_overrides','desc_ov_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','desc_overrides','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','desc_overrides','`desc_ov_ukey`,`desc_ov_forkey_dom`,`desc_ov_forkey_ent`,`desc_ov_forkey_pro`',''); + +-- CONSTRAINT desc_overrides.desc_ov_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_dom','RESTRICT',''); + +-- CONSTRAINT desc_overrides.desc_ov_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_ent','RESTRICT',''); + +-- CONSTRAINT desc_overrides.desc_ov_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','desc_overrides','desc_ov_forkey_pro','RESTRICT',''); + +-- CONSTRAINT desc_overrides.desc_ov_ukey + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','desc_overrides','desc_ov_ukey',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','desc_overrides','desc_ov_ukey','UNIQUE',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.double_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','double_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','double_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','double_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','double_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`,`unit_sig`',''); + +-- COLUMN double_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','domain_id',NULL,''); + +-- COLUMN double_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','entity_id',NULL,''); + +-- COLUMN double_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','property_id',NULL,''); + +-- COLUMN double_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','value','double',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','value',NULL,''); + +-- COLUMN double_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','status','utf8_unicode_ci',''); + +-- COLUMN double_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','pidx',NULL,''); + +-- COLUMN double_data.unit_sig + +SELECT tap.has_column('_caosdb_schema_unit_tests','double_data','unit_sig',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','double_data','unit_sig','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','double_data','unit_sig','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','double_data','unit_sig','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','double_data','unit_sig',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','double_data','unit_sig',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','double_data','`domain_id`',''); + +-- INDEX double_data.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','double_data','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','double_data','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','double_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','double_data','`dou_domain_id_entity`,`dou_entity_id_entity`,`dou_property_id_entity`',''); + +-- CONSTRAINT double_data.dou_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','double_data','dou_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','double_data','dou_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','double_data','dou_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','double_data','dou_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT double_data.dou_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','double_data','dou_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','double_data','dou_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','double_data','dou_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','double_data','dou_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT double_data.dou_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','double_data','dou_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','double_data','dou_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','double_data','dou_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','double_data','dou_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.entities +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','entities',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','entities','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','entities','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','entities','`id`,`description`,`role`,`acl`',''); + +-- COLUMN entities.id + +SELECT tap.has_column('_caosdb_schema_unit_tests','entities','id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','id','auto_increment',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','id',NULL,''); + +-- COLUMN entities.description + +SELECT tap.has_column('_caosdb_schema_unit_tests','entities','description',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','description','text',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','description','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','description','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','description','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','description','utf8_unicode_ci',''); + +-- COLUMN entities.role + +SELECT tap.has_column('_caosdb_schema_unit_tests','entities','role',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','role','enum(\'RECORDTYPE\',\'RECORD\',\'FILE\',\'DOMAIN\',\'PROPERTY\',\'DATATYPE\',\'ROLE\',\'QUERYTEMPLATE\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','role','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','role',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','role','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','role','utf8_unicode_ci',''); + +-- COLUMN entities.acl + +SELECT tap.has_column('_caosdb_schema_unit_tests','entities','acl',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','acl','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','acl','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','acl','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','acl',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','acl',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','entities','`PRIMARY`,`entity_entity_acl`',''); + +-- CONSTRAINT entities.entity_entity_acl + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entities','entity_entity_acl',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entities','entity_entity_acl','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','entities','entity_entity_acl','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','entities','entity_entity_acl','RESTRICT',''); + +-- CONSTRAINT entities.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entities','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entities','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','entities','`id`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.entity_acl +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','entity_acl',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','entity_acl','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','entity_acl','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','entity_acl','`id`,`acl`',''); + +-- COLUMN entity_acl.id + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_acl','id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_acl','id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_acl','id','auto_increment',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_acl','id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_acl','id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_acl','id',NULL,''); + +-- COLUMN entity_acl.acl + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_acl','acl',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_acl','acl','varbinary(65525)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_acl','acl','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_acl','acl',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_acl','acl',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_acl','acl',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','entity_acl','`entity_acl_acl`',''); + +-- INDEX entity_acl.entity_acl_acl + +SELECT tap.has_index('_caosdb_schema_unit_tests','entity_acl','entity_acl_acl',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','entity_acl','entity_acl_acl','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','entity_acl','`acl`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','entity_acl','`PRIMARY`',''); + +-- CONSTRAINT entity_acl.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entity_acl','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entity_acl','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','entity_acl','`id`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.enum_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','enum_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','enum_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','enum_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','enum_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`',''); + +-- COLUMN enum_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','domain_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','domain_id',NULL,''); + +-- COLUMN enum_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','entity_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','entity_id',NULL,''); + +-- COLUMN enum_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','property_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','property_id',NULL,''); + +-- COLUMN enum_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','value','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','value',NULL,''); + +-- COLUMN enum_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','status','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','status','utf8_unicode_ci',''); + +-- COLUMN enum_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','enum_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','enum_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','enum_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','enum_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','enum_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','enum_data','pidx',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','enum_data','`enum_ov_dom_ent_idx`',''); + +-- INDEX enum_data.enum_ov_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','enum_data','enum_ov_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','enum_data','enum_ov_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','enum_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','enum_data','`enum_ov_forkey_dom`,`enum_ov_forkey_ent`,`enum_ov_forkey_pro`',''); + +-- CONSTRAINT enum_data.enum_ov_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_dom','RESTRICT',''); + +-- CONSTRAINT enum_data.enum_ov_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_ent','RESTRICT',''); + +-- CONSTRAINT enum_data.enum_ov_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','enum_data','enum_ov_forkey_pro','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.files +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','files',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','files','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','files','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','files','`file_id`,`path`,`size`,`hash`,`checked_timestamp`',''); + +-- COLUMN files.file_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','files','file_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','file_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','file_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','file_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','file_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','file_id',NULL,''); + +-- COLUMN files.path + +SELECT tap.has_column('_caosdb_schema_unit_tests','files','path',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','path','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','path','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','path',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','path','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','path','utf8_unicode_ci',''); + +-- COLUMN files.size + +SELECT tap.has_column('_caosdb_schema_unit_tests','files','size',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','size','bigint(20) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','size','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','size',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','size',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','size',NULL,''); + +-- COLUMN files.hash + +SELECT tap.has_column('_caosdb_schema_unit_tests','files','hash',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','hash','binary(64)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','hash','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','hash','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','hash',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','hash',NULL,''); + +-- COLUMN files.checked_timestamp + +SELECT tap.has_column('_caosdb_schema_unit_tests','files','checked_timestamp',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','checked_timestamp','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','checked_timestamp','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','checked_timestamp',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','checked_timestamp',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','checked_timestamp',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','files','`PRIMARY`,`fil_file_id_entity`',''); + +-- CONSTRAINT files.fil_file_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','fil_file_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','fil_file_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT',''); + +-- CONSTRAINT files.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','files','`file_id`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.integer_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','integer_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','integer_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','integer_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','integer_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`,`unit_sig`',''); + +-- COLUMN integer_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','domain_id',NULL,''); + +-- COLUMN integer_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','entity_id',NULL,''); + +-- COLUMN integer_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','property_id',NULL,''); + +-- COLUMN integer_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','value','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','value',NULL,''); + +-- COLUMN integer_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','status','utf8_unicode_ci',''); + +-- COLUMN integer_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','pidx',NULL,''); + +-- COLUMN integer_data.unit_sig + +SELECT tap.has_column('_caosdb_schema_unit_tests','integer_data','unit_sig',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','integer_data','unit_sig','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','integer_data','unit_sig','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','integer_data','unit_sig','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','integer_data','unit_sig',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','integer_data','unit_sig',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','integer_data','`domain_id`',''); + +-- INDEX integer_data.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','integer_data','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','integer_data','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','integer_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','integer_data','`int_domain_id_entity`,`int_entity_id_entity`,`int_property_id_entity`',''); + +-- CONSTRAINT integer_data.int_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','integer_data','int_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','integer_data','int_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','integer_data','int_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','integer_data','int_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT integer_data.int_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','integer_data','int_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','integer_data','int_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','integer_data','int_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','integer_data','int_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT integer_data.int_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','integer_data','int_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','integer_data','int_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','integer_data','int_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','integer_data','int_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.isa_cache +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','isa_cache',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','isa_cache','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','isa_cache','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','isa_cache','`child`,`parent`,`rpath`',''); + +-- COLUMN isa_cache.child + +SELECT tap.has_column('_caosdb_schema_unit_tests','isa_cache','child',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','isa_cache','child','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','isa_cache','child','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','isa_cache','child',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','isa_cache','child',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','isa_cache','child',NULL,''); + +-- COLUMN isa_cache.parent + +SELECT tap.has_column('_caosdb_schema_unit_tests','isa_cache','parent',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','isa_cache','parent','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','isa_cache','parent','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','isa_cache','parent',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','isa_cache','parent',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','isa_cache','parent',NULL,''); + +-- COLUMN isa_cache.rpath + +SELECT tap.has_column('_caosdb_schema_unit_tests','isa_cache','rpath',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','isa_cache','rpath','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','isa_cache','rpath','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','isa_cache','rpath',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','isa_cache','rpath','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','isa_cache','rpath','utf8_unicode_ci',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','isa_cache','`PRIMARY`,`isa_cache_child_entity`,`isa_cache_parent_entity`',''); + +-- CONSTRAINT isa_cache.isa_cache_child_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','isa_cache','isa_cache_child_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','isa_cache','isa_cache_child_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','isa_cache','isa_cache_child_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','isa_cache','isa_cache_child_entity','RESTRICT',''); + +-- CONSTRAINT isa_cache.isa_cache_parent_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','isa_cache','isa_cache_parent_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','isa_cache','isa_cache_parent_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','isa_cache','isa_cache_parent_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','isa_cache','isa_cache_parent_entity','RESTRICT',''); + +-- CONSTRAINT isa_cache.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','isa_cache','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','isa_cache','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','isa_cache','`child`,`parent`,`rpath`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.logging +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','logging',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','logging','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','logging','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','logging','`level`,`logger`,`message`,`millis`,`logRecord`',''); + +-- COLUMN logging.level + +SELECT tap.has_column('_caosdb_schema_unit_tests','logging','level',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','logging','level','int(11)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','logging','level','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','logging','level',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','logging','level',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','logging','level',NULL,''); + +-- COLUMN logging.logger + +SELECT tap.has_column('_caosdb_schema_unit_tests','logging','logger',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','logging','logger','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','logging','logger','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','logging','logger',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','logging','logger','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','logging','logger','utf8_unicode_ci',''); + +-- COLUMN logging.message + +SELECT tap.has_column('_caosdb_schema_unit_tests','logging','message',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','logging','message','mediumtext',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','logging','message','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','logging','message',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','logging','message','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','logging','message','utf8_unicode_ci',''); + +-- COLUMN logging.millis + +SELECT tap.has_column('_caosdb_schema_unit_tests','logging','millis',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','logging','millis','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','logging','millis','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','logging','millis',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','logging','millis',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','logging','millis',NULL,''); + +-- COLUMN logging.logRecord + +SELECT tap.has_column('_caosdb_schema_unit_tests','logging','logRecord',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','logging','logRecord','blob',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','logging','logRecord','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','logging','logRecord',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','logging','logRecord',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','logging','logRecord',NULL,''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.name_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','name_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','name_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','name_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','name_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`',''); + +-- COLUMN name_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','domain_id',NULL,''); + +-- COLUMN name_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','entity_id',NULL,''); + +-- COLUMN name_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','property_id',NULL,''); + +-- COLUMN name_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','value','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','value','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','value','utf8_unicode_ci',''); + +-- COLUMN name_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','status','utf8_unicode_ci',''); + +-- COLUMN name_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_data','pidx',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','name_data','`domain_id`,`entity_id`,`property_id`,`value`',''); + +-- INDEX name_data.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','name_data','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','name_data','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','name_data','`domain_id`,`entity_id`',''); + +-- INDEX name_data.entity_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','name_data','entity_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','name_data','entity_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','name_data','`entity_id`',''); + +-- INDEX name_data.property_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','name_data','property_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','name_data','property_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','name_data','`property_id`',''); + +-- INDEX name_data.value + +SELECT tap.has_index('_caosdb_schema_unit_tests','name_data','value',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','name_data','value','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','name_data','`value`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','name_data','`name_data_domain_id_entity`,`domain_id_2`,`name_data_entity_id_entity`,`name_data_property_id_entity`',''); + +-- CONSTRAINT name_data.name_data_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_data','name_data_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_data','name_data_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_data','name_data_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_data','name_data_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT name_data.domain_id_2 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_data','domain_id_2',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_data','domain_id_2','UNIQUE',''); + +-- CONSTRAINT name_data.name_data_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_data','name_data_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_data','name_data_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_data','name_data_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_data','name_data_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT name_data.name_data_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_data','name_data_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_data','name_data_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_data','name_data_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_data','name_data_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.name_overrides +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','name_overrides',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','name_overrides','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','name_overrides','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','name_overrides','`domain_id`,`entity_id`,`property_id`,`name`',''); + +-- COLUMN name_overrides.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_overrides','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_overrides','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_overrides','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_overrides','domain_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_overrides','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_overrides','domain_id',NULL,''); + +-- COLUMN name_overrides.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_overrides','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_overrides','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_overrides','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_overrides','entity_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_overrides','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_overrides','entity_id',NULL,''); + +-- COLUMN name_overrides.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_overrides','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_overrides','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_overrides','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_overrides','property_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_overrides','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_overrides','property_id',NULL,''); + +-- COLUMN name_overrides.name + +SELECT tap.has_column('_caosdb_schema_unit_tests','name_overrides','name',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','name_overrides','name','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','name_overrides','name','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','name_overrides','name','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','name_overrides','name','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','name_overrides','name','utf8_unicode_ci',''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','name_overrides','`name_ov_dom_ent_idx`',''); + +-- INDEX name_overrides.name_ov_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','name_overrides','name_ov_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','name_overrides','name_ov_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','name_overrides','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','name_overrides','`name_ov_ukey`,`name_ov_forkey_dom`,`name_ov_forkey_ent`,`name_ov_forkey_pro`',''); + +-- CONSTRAINT name_overrides.name_ov_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_dom','RESTRICT',''); + +-- CONSTRAINT name_overrides.name_ov_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_ent','RESTRICT',''); + +-- CONSTRAINT name_overrides.name_ov_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','name_overrides','name_ov_forkey_pro','RESTRICT',''); + +-- CONSTRAINT name_overrides.name_ov_ukey + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','name_overrides','name_ov_ukey',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','name_overrides','name_ov_ukey','UNIQUE',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.null_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','null_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','null_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','null_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','null_data','`domain_id`,`entity_id`,`property_id`,`status`,`pidx`',''); + +-- COLUMN null_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','null_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','null_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','null_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','null_data','domain_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','null_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','null_data','domain_id',NULL,''); + +-- COLUMN null_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','null_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','null_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','null_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','null_data','entity_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','null_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','null_data','entity_id',NULL,''); + +-- COLUMN null_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','null_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','null_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','null_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','null_data','property_id','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','null_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','null_data','property_id',NULL,''); + +-- COLUMN null_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','null_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','null_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','null_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','null_data','status','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','null_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','null_data','status','utf8_unicode_ci',''); + +-- COLUMN null_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','null_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','null_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','null_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','null_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','null_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','null_data','pidx',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','null_data','`null_data_dom_ent_idx`',''); + +-- INDEX null_data.null_data_dom_ent_idx + +SELECT tap.has_index('_caosdb_schema_unit_tests','null_data','null_data_dom_ent_idx',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','null_data','null_data_dom_ent_idx','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','null_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','null_data','`null_forkey_dom`,`null_forkey_ent`,`null_forkey_pro`',''); + +-- CONSTRAINT null_data.null_forkey_dom + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','null_data','null_forkey_dom',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','null_data','null_forkey_dom','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','null_data','null_forkey_dom','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','null_data','null_forkey_dom','RESTRICT',''); + +-- CONSTRAINT null_data.null_forkey_ent + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','null_data','null_forkey_ent',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','null_data','null_forkey_ent','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','null_data','null_forkey_ent','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','null_data','null_forkey_ent','RESTRICT',''); + +-- CONSTRAINT null_data.null_forkey_pro + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','null_data','null_forkey_pro',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','null_data','null_forkey_pro','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','null_data','null_forkey_pro','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','null_data','null_forkey_pro','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.passwd +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','passwd',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','passwd','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','passwd','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','passwd','`principal`,`hash`,`alg`,`it`,`salt`',''); + +-- COLUMN passwd.principal + +SELECT tap.has_column('_caosdb_schema_unit_tests','passwd','principal',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','passwd','principal','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','passwd','principal','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','passwd','principal',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','passwd','principal',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','passwd','principal',NULL,''); + +-- COLUMN passwd.hash + +SELECT tap.has_column('_caosdb_schema_unit_tests','passwd','hash',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','passwd','hash','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','passwd','hash','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','passwd','hash',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','passwd','hash',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','passwd','hash',NULL,''); + +-- COLUMN passwd.alg + +SELECT tap.has_column('_caosdb_schema_unit_tests','passwd','alg',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','passwd','alg','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','passwd','alg','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','passwd','alg','\'SHA-512\'',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','passwd','alg','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','passwd','alg','utf8_unicode_ci',''); + +-- COLUMN passwd.it + +SELECT tap.has_column('_caosdb_schema_unit_tests','passwd','it',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','passwd','it','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','passwd','it','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','passwd','it',5000,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','passwd','it',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','passwd','it',NULL,''); + +-- COLUMN passwd.salt + +SELECT tap.has_column('_caosdb_schema_unit_tests','passwd','salt',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','passwd','salt','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','passwd','salt','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','passwd','salt',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','passwd','salt',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','passwd','salt',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','passwd','`PRIMARY`',''); + +-- CONSTRAINT passwd.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','passwd','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','passwd','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','passwd','`principal`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.permissions +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','permissions',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','permissions','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','permissions','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','permissions','`role`,`permissions`',''); + +-- COLUMN permissions.role + +SELECT tap.has_column('_caosdb_schema_unit_tests','permissions','role',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','permissions','role','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','permissions','role','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','permissions','role',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','permissions','role',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','permissions','role',NULL,''); + +-- COLUMN permissions.permissions + +SELECT tap.has_column('_caosdb_schema_unit_tests','permissions','permissions',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','permissions','permissions','mediumtext',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','permissions','permissions','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','permissions','permissions',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','permissions','permissions','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','permissions','permissions','utf8_unicode_ci',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','permissions','`PRIMARY`,`perm_name_roles`',''); + +-- CONSTRAINT permissions.perm_name_roles + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','permissions','perm_name_roles',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','permissions','perm_name_roles','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','permissions','perm_name_roles','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','permissions','perm_name_roles','RESTRICT',''); + +-- CONSTRAINT permissions.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','permissions','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','permissions','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','permissions','`role`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.query_template_def +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','query_template_def',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','query_template_def','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','query_template_def','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','query_template_def','`id`,`definition`',''); + +-- COLUMN query_template_def.id + +SELECT tap.has_column('_caosdb_schema_unit_tests','query_template_def','id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','query_template_def','id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','query_template_def','id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','query_template_def','id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','query_template_def','id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','query_template_def','id',NULL,''); + +-- COLUMN query_template_def.definition + +SELECT tap.has_column('_caosdb_schema_unit_tests','query_template_def','definition',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','query_template_def','definition','mediumtext',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','query_template_def','definition','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','query_template_def','definition',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','query_template_def','definition','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','query_template_def','definition','utf8_unicode_ci',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','query_template_def','`PRIMARY`,`query_template_def_ibfk_1`',''); + +-- CONSTRAINT query_template_def.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','query_template_def','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','query_template_def','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','query_template_def','`id`',''); + +-- CONSTRAINT query_template_def.query_template_def_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','query_template_def','query_template_def_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','query_template_def','query_template_def_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','query_template_def','query_template_def_ibfk_1','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','query_template_def','query_template_def_ibfk_1','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.reference_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','reference_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','reference_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','reference_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','reference_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`,`value_iversion`',''); + +-- COLUMN reference_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','domain_id',NULL,''); + +-- COLUMN reference_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','entity_id',NULL,''); + +-- COLUMN reference_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','property_id',NULL,''); + +-- COLUMN reference_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','value','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','value',NULL,''); + +-- COLUMN reference_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','status','utf8_unicode_ci',''); + +-- COLUMN reference_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','pidx',NULL,''); + +-- COLUMN reference_data.value_iversion + +SELECT tap.has_column('_caosdb_schema_unit_tests','reference_data','value_iversion',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','reference_data','value_iversion','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','reference_data','value_iversion','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','reference_data','value_iversion','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','reference_data','value_iversion',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','reference_data','value_iversion',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','reference_data','`entity_id`,`value`',''); + +-- INDEX reference_data.entity_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','reference_data','entity_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','reference_data','entity_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','reference_data','`entity_id`,`property_id`',''); + +-- INDEX reference_data.value + +SELECT tap.has_index('_caosdb_schema_unit_tests','reference_data','value',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','reference_data','value','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','reference_data','`value`,`value_iversion`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','reference_data','`ref_domain_id_entity`,`ref_entity_id_entity`,`ref_property_id_entity`,`ref_value_entity`,`reference_data_ibfk_1`',''); + +-- CONSTRAINT reference_data.ref_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','reference_data','ref_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','reference_data','ref_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','reference_data','ref_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','reference_data','ref_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT reference_data.ref_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','reference_data','ref_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','reference_data','ref_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','reference_data','ref_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','reference_data','ref_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT reference_data.ref_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','reference_data','ref_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','reference_data','ref_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','reference_data','ref_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','reference_data','ref_property_id_entity','RESTRICT',''); + +-- CONSTRAINT reference_data.ref_value_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','reference_data','ref_value_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','reference_data','ref_value_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','reference_data','ref_value_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','reference_data','ref_value_entity','RESTRICT',''); + +-- CONSTRAINT reference_data_ibfk_1 +SELECT tap.has_constraint('_caosdb_schema_unit_tests','reference_data','reference_data_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','reference_data','reference_data_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','reference_data','reference_data_ibfk_1','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','reference_data','reference_data_ibfk_1','RESTRICT',''); + + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.roles +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','roles',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','roles','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','roles','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','roles','`name`,`description`',''); + +-- COLUMN roles.name + +SELECT tap.has_column('_caosdb_schema_unit_tests','roles','name',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','roles','name','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','roles','name','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','roles','name',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','roles','name',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','roles','name',NULL,''); + +-- COLUMN roles.description + +SELECT tap.has_column('_caosdb_schema_unit_tests','roles','description',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','roles','description','mediumtext',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','roles','description','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','roles','description','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','roles','description','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','roles','description','utf8_unicode_ci',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','roles','`PRIMARY`',''); + +-- CONSTRAINT roles.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','roles','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','roles','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','roles','`name`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.rules +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','rules',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','rules','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','rules','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','rules','`domain_id`,`entity_id`,`transaction`,`criterion`,`modus`',''); + +-- COLUMN rules.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','rules','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','rules','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','rules','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','rules','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','rules','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','rules','domain_id',NULL,''); + +-- COLUMN rules.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','rules','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','rules','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','rules','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','rules','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','rules','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','rules','entity_id',NULL,''); + +-- COLUMN rules.transaction + +SELECT tap.has_column('_caosdb_schema_unit_tests','rules','transaction',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','rules','transaction','enum(\'INSERT\',\'RETRIEVE\',\'UPDATE\',\'DELETE\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','rules','transaction','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','rules','transaction',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','rules','transaction','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','rules','transaction','utf8_unicode_ci',''); + +-- COLUMN rules.criterion + +SELECT tap.has_column('_caosdb_schema_unit_tests','rules','criterion',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','rules','criterion','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','rules','criterion','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','rules','criterion',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','rules','criterion','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','rules','criterion','utf8_unicode_ci',''); + +-- COLUMN rules.modus + +SELECT tap.has_column('_caosdb_schema_unit_tests','rules','modus',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','rules','modus','enum(\'MUST\',\'SHOULD\',\'SHOULDNT\',\'MUSTNOT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','rules','modus','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','rules','modus',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','rules','modus','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','rules','modus','utf8_unicode_ci',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','rules','`rule_domain_id_entity`,`rule_entity_id_entity`',''); + +-- CONSTRAINT rules.rule_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','rules','rule_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','rules','rule_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','rules','rule_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','rules','rule_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT rules.rule_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','rules','rule_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','rules','rule_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','rules','rule_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','rules','rule_entity_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.stats +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','stats',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','stats','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','stats','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','stats','`name`,`value`',''); + +-- COLUMN stats.name + +SELECT tap.has_column('_caosdb_schema_unit_tests','stats','name',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','stats','name','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','stats','name','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','stats','name',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','stats','name','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','stats','name','utf8_unicode_ci',''); + +-- COLUMN stats.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','stats','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','stats','value','blob',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','stats','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','stats','value','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','stats','value',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','stats','value',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','stats','`PRIMARY`',''); + +-- CONSTRAINT stats.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','stats','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','stats','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','stats','`name`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.text_data +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','text_data',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','text_data','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','text_data','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','text_data','`domain_id`,`entity_id`,`property_id`,`value`,`status`,`pidx`',''); + +-- COLUMN text_data.domain_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','domain_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','domain_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','domain_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','domain_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','domain_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','domain_id',NULL,''); + +-- COLUMN text_data.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','entity_id',NULL,''); + +-- COLUMN text_data.property_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','property_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','property_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','property_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','property_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','property_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','property_id',NULL,''); + +-- COLUMN text_data.value + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','value',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','value','text',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','value','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','value',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','value','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','value','utf8_unicode_ci',''); + +-- COLUMN text_data.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','status','enum(\'OBLIGATORY\',\'RECOMMENDED\',\'SUGGESTED\',\'FIX\',\'REPLACEMENT\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','status',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','status','utf8_unicode_ci',''); + +-- COLUMN text_data.pidx + +SELECT tap.has_column('_caosdb_schema_unit_tests','text_data','pidx',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','text_data','pidx','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','text_data','pidx','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','text_data','pidx',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','text_data','pidx',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','text_data','pidx',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','text_data','`domain_id`',''); + +-- INDEX text_data.domain_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','text_data','domain_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','text_data','domain_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','text_data','`domain_id`,`entity_id`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','text_data','`str_domain_id_entity`,`str_entity_id_entity`,`str_property_id_entity`',''); + +-- CONSTRAINT text_data.str_domain_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','text_data','str_domain_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','text_data','str_domain_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','text_data','str_domain_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','text_data','str_domain_id_entity','RESTRICT',''); + +-- CONSTRAINT text_data.str_entity_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','text_data','str_entity_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','text_data','str_entity_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','text_data','str_entity_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','text_data','str_entity_id_entity','RESTRICT',''); + +-- CONSTRAINT text_data.str_property_id_entity + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','text_data','str_property_id_entity',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','text_data','str_property_id_entity','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','text_data','str_property_id_entity','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','text_data','str_property_id_entity','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.transaction_log +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','transaction_log',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','transaction_log','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','transaction_log','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','transaction_log','`transaction`,`entity_id`,`username`,`seconds`,`nanos`,`realm`',''); + +-- COLUMN transaction_log.transaction + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','transaction',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','transaction','varchar(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','transaction','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','transaction',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','transaction','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','transaction','utf8_unicode_ci',''); + +-- COLUMN transaction_log.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','entity_id',NULL,''); + +-- COLUMN transaction_log.username + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','username',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','username','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','username','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','username',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','username',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','username',NULL,''); + +-- COLUMN transaction_log.seconds + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','seconds',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','seconds','bigint(20) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','seconds','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','seconds',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','seconds',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','seconds',NULL,''); + +-- COLUMN transaction_log.nanos + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','nanos',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','nanos','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','nanos','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','nanos',0,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','nanos',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','nanos',NULL,''); + +-- COLUMN transaction_log.realm + +SELECT tap.has_column('_caosdb_schema_unit_tests','transaction_log','realm',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','transaction_log','realm','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','transaction_log','realm','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','transaction_log','realm',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','transaction_log','realm',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','transaction_log','realm',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','transaction_log','`entity_id`',''); + +-- INDEX transaction_log.entity_id + +SELECT tap.has_index('_caosdb_schema_unit_tests','transaction_log','entity_id',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','transaction_log','entity_id','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','transaction_log','`entity_id`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.units_lin_con +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','units_lin_con',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','units_lin_con','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','units_lin_con','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','units_lin_con','`signature_from`,`signature_to`,`a`,`b_dividend`,`b_divisor`,`c`',''); + +-- COLUMN units_lin_con.signature_from + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','signature_from',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','signature_from','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','signature_from','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','signature_from',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','signature_from',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','signature_from',NULL,''); + +-- COLUMN units_lin_con.signature_to + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','signature_to',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','signature_to','bigint(20)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','signature_to','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','signature_to',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','signature_to',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','signature_to',NULL,''); + +-- COLUMN units_lin_con.a + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','a',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','a','decimal(65,30)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','a','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','a',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','a',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','a',NULL,''); + +-- COLUMN units_lin_con.b_dividend + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','b_dividend',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','b_dividend','int(11)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','b_dividend','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','b_dividend',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','b_dividend',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','b_dividend',NULL,''); + +-- COLUMN units_lin_con.b_divisor + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','b_divisor',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','b_divisor','int(11)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','b_divisor','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','b_divisor',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','b_divisor',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','b_divisor',NULL,''); + +-- COLUMN units_lin_con.c + +SELECT tap.has_column('_caosdb_schema_unit_tests','units_lin_con','c',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','units_lin_con','c','decimal(65,30)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','units_lin_con','c','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','units_lin_con','c',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','units_lin_con','c',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','units_lin_con','c',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','units_lin_con','`PRIMARY`',''); + +-- CONSTRAINT units_lin_con.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','units_lin_con','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','units_lin_con','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','units_lin_con','`signature_from`',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.user_info +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','user_info',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','user_info','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','user_info','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','user_info','`realm`,`name`,`email`,`status`,`entity`',''); + +-- COLUMN user_info.realm + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_info','realm',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_info','realm','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_info','realm','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_info','realm',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_info','realm',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_info','realm',NULL,''); + +-- COLUMN user_info.name + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_info','name',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_info','name','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_info','name','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_info','name',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_info','name',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_info','name',NULL,''); + +-- COLUMN user_info.email + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_info','email',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_info','email','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_info','email','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_info','email','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_info','email',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_info','email',NULL,''); + +-- COLUMN user_info.status + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_info','status',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_info','status','enum(\'ACTIVE\',\'INACTIVE\')',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_info','status','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_info','status','\'INACTIVE\'',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_info','status','utf8',''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_info','status','utf8_unicode_ci',''); + +-- COLUMN user_info.entity + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_info','entity',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_info','entity','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_info','entity','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_info','entity','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_info','entity',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_info','entity',NULL,''); + +-- INDEXES +SELECT tap.indexes_are('_caosdb_schema_unit_tests','user_info','`subject_entity`',''); + +-- INDEX user_info.subject_entity + +SELECT tap.has_index('_caosdb_schema_unit_tests','user_info','subject_entity',''); +SELECT tap.index_is_type('_caosdb_schema_unit_tests','user_info','subject_entity','BTREE',''); +SELECT tap.is_indexed('_caosdb_schema_unit_tests','user_info','`entity`',''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','user_info','`PRIMARY`,`subjects_ibfk_1`',''); + +-- CONSTRAINT user_info.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','user_info','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','user_info','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','user_info','`realm`,`name`',''); + +-- CONSTRAINT user_info.subjects_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','user_info','subjects_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','user_info','subjects_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','user_info','subjects_ibfk_1','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','user_info','subjects_ibfk_1','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.user_roles +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','user_roles',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','user_roles','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','user_roles','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','user_roles','`realm`,`user`,`role`',''); + +-- COLUMN user_roles.realm + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_roles','realm',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_roles','realm','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_roles','realm','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_roles','realm',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_roles','realm',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_roles','realm',NULL,''); + +-- COLUMN user_roles.user + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_roles','user',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_roles','user','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_roles','user','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_roles','user',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_roles','user',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_roles','user',NULL,''); + +-- COLUMN user_roles.role + +SELECT tap.has_column('_caosdb_schema_unit_tests','user_roles','role',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','user_roles','role','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','user_roles','role','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','user_roles','role',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','user_roles','role',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','user_roles','role',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','user_roles','`PRIMARY`,`user_roles_ibfk_1`',''); + +-- CONSTRAINT user_roles.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','user_roles','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','user_roles','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','user_roles','`realm`,`user`,`role`',''); + +-- CONSTRAINT user_roles.user_roles_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','user_roles','user_roles_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','user_roles','user_roles_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','user_roles','user_roles_ibfk_1','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','user_roles','user_roles_ibfk_1','RESTRICT',''); + +-- *************************************************************** +-- TABLE _caosdb_schema_unit_tests.entity_version +-- *************************************************************** + +SELECT tap.has_table('_caosdb_schema_unit_tests','entity_version',''); +SELECT tap.table_collation_is('_caosdb_schema_unit_tests','entity_version','utf8_unicode_ci',''); +SELECT tap.table_engine_is('_caosdb_schema_unit_tests','entity_version','InnoDB',''); + +-- COLUMNS +SELECT tap.columns_are('_caosdb_schema_unit_tests','entity_version','`entity_id`,`hash`,`version`,`_iversion`,`_ipparent`,`srid`',''); + +-- COLUMN entity_version.entity_id + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','entity_id',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','entity_id','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','entity_id','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','entity_id',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','entity_id',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','entity_id',NULL,''); + +-- COLUMN entity_version.hash + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','hash',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','hash','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','hash','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','hash','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','hash',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','hash',NULL,''); + +-- COLUMN entity_version.version + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','version',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','version','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','version','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','version',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','version',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','version',NULL,''); + +-- COLUMN entity_version._iversion + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','_iversion',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','_iversion','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','_iversion','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','_iversion',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','_iversion',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','_iversion',NULL,''); + +-- COLUMN entity_version._ipparent + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','_ipparent',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','_ipparent','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','_ipparent','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','_ipparent','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','_ipparent',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','_ipparent',NULL,''); + +-- COLUMN entity_version.srid + +SELECT tap.has_column('_caosdb_schema_unit_tests','entity_version','srid',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entity_version','srid','varbinary(255)',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entity_version','srid','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','entity_version','srid',NULL,''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entity_version','srid',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entity_version','srid',NULL,''); + +-- CONSTRAINTS +SELECT tap.constraints_are('_caosdb_schema_unit_tests','entity_version','`entity_version-e-v`,`PRIMARY`,`entity_version_ibfk_1`,`entity_version_ibfk_2`',''); + +-- CONSTRAINT entity_version.entity_id + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entity_version','entity_version-e-v',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entity_version','entity_version-e-v','UNIQUE',''); + +-- CONSTRAINT entity_version.PRIMARY + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entity_version','PRIMARY',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entity_version','PRIMARY','PRIMARY KEY',''); +SELECT tap.col_is_pk('_caosdb_schema_unit_tests','entity_version','`entity_id`,`_iversion`',''); + +-- CONSTRAINT entity_version.entity_version_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_1','CASCADE',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_1','RESTRICT',''); + +-- CONSTRAINT entity_version.entity_version_ibfk_2 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_2',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_2','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_2','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','entity_version','entity_version_ibfk_2','RESTRICT',''); + + +-- *************************************************************** +-- FUNCTIONS +-- *************************************************************** + +-- FUNCTION _caosdb_schema_unit_tests.CaosDBVersion + +SELECT tap.has_function('_caosdb_schema_unit_tests','CaosDBVersion',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','CaosDBVersion','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','CaosDBVersion','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','CaosDBVersion','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','CaosDBVersion','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.convert_unit + +SELECT tap.has_function('_caosdb_schema_unit_tests','convert_unit',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','convert_unit','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','convert_unit','decimal',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','convert_unit','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','convert_unit','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.constructDateTimeWhereClauseForColumn + +SELECT tap.has_function('_caosdb_schema_unit_tests','constructDateTimeWhereClauseForColumn',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','constructDateTimeWhereClauseForColumn','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','constructDateTimeWhereClauseForColumn','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','constructDateTimeWhereClauseForColumn','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','constructDateTimeWhereClauseForColumn','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.getAggValueWhereClause + +SELECT tap.has_function('_caosdb_schema_unit_tests','getAggValueWhereClause',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','getAggValueWhereClause','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','getAggValueWhereClause','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','getAggValueWhereClause','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','getAggValueWhereClause','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.getDateTimeWhereClause + +SELECT tap.has_function('_caosdb_schema_unit_tests','getDateTimeWhereClause',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','getDateTimeWhereClause','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','getDateTimeWhereClause','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','getDateTimeWhereClause','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','getDateTimeWhereClause','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.getDoubleWhereClause + +SELECT tap.has_function('_caosdb_schema_unit_tests','getDoubleWhereClause',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','getDoubleWhereClause','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','getDoubleWhereClause','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','getDoubleWhereClause','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','getDoubleWhereClause','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.getDateWhereClause + +SELECT tap.has_function('_caosdb_schema_unit_tests','getDateWhereClause',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','getDateWhereClause','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','getDateWhereClause','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','getDateWhereClause','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','getDateWhereClause','CONTAINS SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.makeStmt + +SELECT tap.has_function('_caosdb_schema_unit_tests','makeStmt',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','makeStmt','NO',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','makeStmt','varchar',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','makeStmt','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','makeStmt','NO SQL',''); + +-- FUNCTION _caosdb_schema_unit_tests.standard_unit + +SELECT tap.has_function('_caosdb_schema_unit_tests','standard_unit',''); +SELECT tap.function_is_deterministic('_caosdb_schema_unit_tests','standard_unit','YES',''); +SELECT tap.function_data_type_is('_caosdb_schema_unit_tests','standard_unit','bigint',''); +SELECT tap.function_security_type_is('_caosdb_schema_unit_tests','standard_unit','DEFINER',''); +SELECT tap.function_sql_data_access_is('_caosdb_schema_unit_tests','standard_unit','CONTAINS SQL',''); + +-- *************************************************************** +-- PROCEDURES +-- *************************************************************** + +-- PROCEDURES _caosdb_schema_unit_tests.applyBackReference + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applyBackReference',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applyBackReference','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applyBackReference','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applyBackReference','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.applyPOV + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applyPOV',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applyPOV','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applyPOV','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applyPOV','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.applyRefPOV + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applyRefPOV',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applyRefPOV','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applyRefPOV','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applyRefPOV','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.applyIDFilter + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applyIDFilter',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applyIDFilter','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applyIDFilter','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applyIDFilter','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.applySAT + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applySAT',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applySAT','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applySAT','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applySAT','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.applyTransactionFilter + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','applyTransactionFilter',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','applyTransactionFilter','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','applyTransactionFilter','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','applyTransactionFilter','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.calcComplementUnion + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','calcComplementUnion',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','calcComplementUnion','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','calcComplementUnion','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','calcComplementUnion','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.calcDifference + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','calcDifference',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','calcDifference','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','calcDifference','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','calcDifference','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.calcIntersection + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','calcIntersection',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','calcIntersection','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','calcIntersection','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','calcIntersection','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.calcUnion + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','calcUnion',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','calcUnion','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','calcUnion','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','calcUnion','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.cleanUpLinCon + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','cleanUpLinCon',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','cleanUpLinCon','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','cleanUpLinCon','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','cleanUpLinCon','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.cleanUpQuery + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','cleanUpQuery',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','cleanUpQuery','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','cleanUpQuery','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','cleanUpQuery','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.copyTable + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','copyTable',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','copyTable','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','copyTable','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','copyTable','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.createTmpTable + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','createTmpTable',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','createTmpTable','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','createTmpTable','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','createTmpTable','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.createTmpTable2 + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','createTmpTable2',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','createTmpTable2','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','createTmpTable2','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','createTmpTable2','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.deleteEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','deleteEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','deleteEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','deleteEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','deleteEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.deleteEntityProperties + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','deleteEntityProperties',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','deleteEntityProperties','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','deleteEntityProperties','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','deleteEntityProperties','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.deleteIsa + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','deleteIsa',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','deleteIsa','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','deleteIsa','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','deleteIsa','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.deleteLinCon + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','deleteLinCon',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','deleteLinCon','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','deleteLinCon','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','deleteLinCon','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.entityACL + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','entityACL',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','entityACL','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','entityACL','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','entityACL','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.finishSubProperty + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','finishSubProperty',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','finishSubProperty','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','finishSubProperty','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','finishSubProperty','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.getChildren + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','getChildren',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','getChildren','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','getChildren','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','getChildren','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.getFileIdByPath + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','getFileIdByPath',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','getFileIdByPath','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','getFileIdByPath','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','getFileIdByPath','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.getRole + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','getRole',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','getRole','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','getRole','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','getRole','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.getRules + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','getRules',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','getRules','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','getRules','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','getRules','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initAutoIncrement + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initAutoIncrement',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initAutoIncrement','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initAutoIncrement','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initAutoIncrement','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initBackReference + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initBackReference',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initBackReference','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initBackReference','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initBackReference','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initDisjunctionFilter + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initDisjunctionFilter',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initDisjunctionFilter','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initDisjunctionFilter','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initDisjunctionFilter','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initPOVRefidsTable + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initPOVRefidsTable',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initPOVRefidsTable','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initPOVRefidsTable','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initPOVRefidsTable','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initQuery + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initQuery',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initQuery','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initQuery','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initQuery','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insertEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','insertEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insertEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insertEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insertEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.getDependentEntities + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','getDependentEntities',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','getDependentEntities','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','getDependentEntities','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','getDependentEntities','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initEmptyTargetSet + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initEmptyTargetSet',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initEmptyTargetSet','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initEmptyTargetSet','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initEmptyTargetSet','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insertLinCon + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','insertLinCon',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insertLinCon','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insertLinCon','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insertLinCon','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insertUser + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','insertUser',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insertUser','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insertUser','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insertUser','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.intersectTable + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','intersectTable',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','intersectTable','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','intersectTable','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','intersectTable','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initPOVPropertiesTable + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initPOVPropertiesTable',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initPOVPropertiesTable','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initPOVPropertiesTable','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initPOVPropertiesTable','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initSubEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initSubEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initSubEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initSubEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initSubEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.isSubtype + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','isSubtype',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','isSubtype','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','isSubtype','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','isSubtype','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.overrideDesc + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','overrideDesc',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','overrideDesc','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','overrideDesc','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','overrideDesc','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.overrideName + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','overrideName',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','overrideName','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','overrideName','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','overrideName','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.overrideType + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','overrideType',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','overrideType','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','overrideType','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','overrideType','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.raiseWarning + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','raiseWarning',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','raiseWarning','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','raiseWarning','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','raiseWarning','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.registerSubdomain + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','registerSubdomain',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','registerSubdomain','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','registerSubdomain','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','registerSubdomain','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.initSubProperty + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','initSubProperty',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','initSubProperty','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','initSubProperty','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','initSubProperty','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insertEntityProperty + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','insertEntityProperty',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insertEntityProperty','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insertEntityProperty','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insertEntityProperty','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.registerTempTableName + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','registerTempTableName',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','registerTempTableName','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','registerTempTableName','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','registerTempTableName','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveDatatype + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveDatatype',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveDatatype','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveDatatype','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveDatatype','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveEntityParents + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveEntityParents',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveEntityParents','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveEntityParents','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveEntityParents','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveGroup + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveGroup',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveGroup','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveGroup','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveGroup','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.setPassword + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','setPassword',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','setPassword','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','setPassword','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','setPassword','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insertIsa + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','insertIsa',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insertIsa','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insertIsa','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insertIsa','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveEntityProperties + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveEntityProperties',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveEntityProperties','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveEntityProperties','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveEntityProperties','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.showEntityAutoIncr + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','showEntityAutoIncr',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','showEntityAutoIncr','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','showEntityAutoIncr','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','showEntityAutoIncr','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.updateLinCon + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','updateLinCon',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','updateLinCon','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','updateLinCon','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','updateLinCon','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.retrieveOverrides + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','retrieveOverrides',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','retrieveOverrides','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','retrieveOverrides','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','retrieveOverrides','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.updateEntity + +SELECT tap.has_procedure('_caosdb_schema_unit_tests','updateEntity',''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','updateEntity','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','updateEntity','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','updateEntity','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.insert_single_child_version + +SELECT tap.has_procedure('_caosdb_schema_unit_tests', 'insert_single_child_version', ''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','insert_single_child_version','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','insert_single_child_version','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','insert_single_child_version','CONTAINS SQL',''); + +-- PROCEDURES _caosdb_schema_unit_tests.delete_all_entity_versions + +SELECT tap.has_procedure('_caosdb_schema_unit_tests', 'delete_all_entity_versions', ''); +SELECT tap.procedure_is_deterministic('_caosdb_schema_unit_tests','delete_all_entity_versions','NO',''); +SELECT tap.procedure_security_type_is('_caosdb_schema_unit_tests','delete_all_entity_versions','DEFINER',''); +SELECT tap.procedure_sql_data_access_is('_caosdb_schema_unit_tests','delete_all_entity_versions','CONTAINS SQL',''); + +CALL tap.finish(); +ROLLBACK; diff --git a/tests/test_entity_versioning.sql b/tests/test_entity_versioning.sql index 0c5147c8dd4baab7cb2d323370ff2db8e18f3845..26efd8c029e9ad01f8966ddd687ed31f3c4a2b49 100644 --- a/tests/test_entity_versioning.sql +++ b/tests/test_entity_versioning.sql @@ -143,6 +143,9 @@ SELECT tap.eq(count(*), 1, "after updateEntity, one entity in archive_entities") FROM archive_entities; +-- TEST get_version_history +CALL get_version_history(@EntityID); + -- TEST retrieveEntity SELECT version INTO @x FROM entity_version