summaryrefslogtreecommitdiff
path: root/src/core/model/Document.cpp
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-16 21:04:40 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-16 21:04:40 +0100
commit257c76122ad7db19382c66985d89815df676e45a (patch)
tree9a9d81ef613b1f5ecdc79fadebaf89960c46c21b /src/core/model/Document.cpp
parentb08c271ca4401ac8e99d49885da600122e5aa398 (diff)
Document.hpp does compile now. Further Tests are needed.
Diffstat (limited to 'src/core/model/Document.cpp')
-rw-r--r--src/core/model/Document.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/core/model/Document.cpp b/src/core/model/Document.cpp
new file mode 100644
index 0000000..31b22e3
--- /dev/null
+++ b/src/core/model/Document.cpp
@@ -0,0 +1,90 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "Document.hpp"
+
+#include <core/common/Exceptions.hpp>
+
+namespace ousia {
+namespace model {
+
+int DocumentEntity::getFieldDescriptorIndex(const std::string &fieldName)
+{
+ const ManagedVector<FieldDescriptor> &fds =
+ descriptor->getFieldDescriptors();
+ unsigned int f = 0;
+
+ // look if we have an empty name.
+ if (fieldName == "") {
+ // in that case we look for a default field.
+ // First: Do we only have one field?
+ if (fds.size() == 1) {
+ // if so we return that one.
+ return f;
+ }
+ // Second: Do we have a TREE field?
+ for (auto &fd : fds) {
+ if (fd->getFieldType() == FieldDescriptor::FieldType::TREE) {
+ return f;
+ }
+ f++;
+ }
+ } else {
+ // otherwise we return the FieldDescriptor with the correct name (if
+ // such a descriptor exists).
+ for (auto &fd : fds) {
+ if (fd->getName() == fieldName) {
+ return f;
+ }
+ f++;
+ }
+ }
+ return -1;
+}
+
+void DocumentEntity::getField(ManagedVector<StructuredEntity> &res,
+ const std::string &fieldName)
+{
+ int f = getFieldDescriptorIndex(fieldName);
+ if (f < 0) {
+ ManagedVector<StructuredEntity> empty{this};
+ res = ManagedVector<StructuredEntity>(this);
+ }
+ res = fields[f];
+}
+
+ManagedVector<StructuredEntity> &DocumentEntity::getField(
+ Rooted<FieldDescriptor> fieldDescriptor)
+{
+ const ManagedVector<FieldDescriptor> &fds =
+ descriptor->getFieldDescriptors();
+ int f = 0;
+ for (auto &fd : fds) {
+ if (fd->getName() == fieldDescriptor->getName() &&
+ fd->getFieldType() == fieldDescriptor->getFieldType()) {
+ return fields[f];
+ }
+ f++;
+ }
+ throw OusiaException(
+ "The given FieldDescriptor is not specified in the Descriptor of this "
+ "node.");
+}
+}
+}
+