From 31d937e448d64dda368a64268bb2e84582944c53 Mon Sep 17 00:00:00 2001
From: Matthias Bodenbenner <m.bodenbenner@wzl-mq.rwth-aachen.de>
Date: Mon, 18 Mar 2024 20:25:34 +0100
Subject: [PATCH] fixed serialization of semantic values

---
 README.md               | 5 ++++-
 setup.py                | 2 +-
 src/soil/datatype.py    | 6 ++++++
 src/soil/measurement.py | 2 +-
 src/soil/parameter.py   | 2 +-
 src/soil/stream.py      | 2 +-
 src/soil/variable.py    | 5 ++---
 7 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index b822b95..46c07fc 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 [![Build](https://git-ce.rwth-aachen.de/wzl-mq-ms/forschung-lehre/lava/unified-device-interface/python/badges/master/pipeline.svg)](https://git-ce.rwth-aachen.de/wzl-mq-ms/forschung-lehre/lava/unified-device-interface/python/commits/master)
 
 # Python Unified Device Interface
-Current stable version: 9.3.5
+Current stable version: 9.3.6
 
 ## Installation
 1. Install the WZL-UDI package via pip
@@ -58,6 +58,9 @@ Funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation)
 
 ## Recent changes
 
+**9.3.6** - 2024-03-18
+  - fixed serialization of semantic values
+
 **9.3.5** - 2024-03-18
   - fixed metadata provisioning of arguments and returns
 
diff --git a/setup.py b/setup.py
index 5023de3..d477a68 100644
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
     long_description = fh.read()
 
 setup(name='wzl-udi',
-      version='9.3.5',
+      version='9.3.6',
       url='https://git-ce.rwth-aachen.de/wzl-mq-public/soil/python',
       project_urls={
           "Bug Tracker": "https://git-ce.rwth-aachen.de/wzl-mq-public/soil/python/-/issues",
diff --git a/src/soil/datatype.py b/src/soil/datatype.py
index d9d5078..fdbede6 100644
--- a/src/soil/datatype.py
+++ b/src/soil/datatype.py
@@ -1,6 +1,9 @@
 import enum
 
+import rdflib
+
 from .error import TypeException
+from .semantics import Namespaces
 
 
 class Datatype(enum.Enum):
@@ -31,3 +34,6 @@ class Datatype(enum.Enum):
         if legacy_mode:
             return ["bool", "int", "double", "string", "time", "enum"][self.value]
         return ["boolean", "int", "float", "string", "time", "enum"][self.value]
+
+    def to_semantic(self):
+        return [rdflib.XSD.boolean, rdflib.XSD.int, rdflib.XSD.float, rdflib.XSD.string, rdflib.XSD.dateTime, rdflib.XSD.string][self.value]
\ No newline at end of file
diff --git a/src/soil/measurement.py b/src/soil/measurement.py
index a2546e7..741c166 100644
--- a/src/soil/measurement.py
+++ b/src/soil/measurement.py
@@ -221,7 +221,7 @@ class Measurement(Variable):
             data_graph.add((measurement_subject, Namespaces.qudt.unit, unit_triples[0][2]))
             data_graph.add((measurement_subject, Namespaces.schema.license, Semantics.data_license))
 
-            rdf_value = Variable.serialize_value(data_graph, self.__getitem__('value', 0))
+            rdf_value = self.serialize_value(data_graph, self.__getitem__('value', 0))
 
             data_graph.add((measurement_subject, Namespaces.qudt.value, rdf_value))
             data_graph.add((measurement_subject, Namespaces.schema.dateCreated,
diff --git a/src/soil/parameter.py b/src/soil/parameter.py
index 55949a3..70cf90d 100644
--- a/src/soil/parameter.py
+++ b/src/soil/parameter.py
@@ -159,7 +159,7 @@ class Parameter(Variable):
                 result.remove(triples[0])
 
             try:
-                rdf_value = Variable.serialize_value(result, self.__getitem__('value', 0))
+                rdf_value = self.serialize_value(result, self.__getitem__('value', 0))
                 result.add((Semantics.namespace[self._semantic_name], Namespaces.qudt['value'], rdf_value))
             except DeviceException as e:
                 if isinstance(e._predecessor, NotImplementedException):
diff --git a/src/soil/stream.py b/src/soil/stream.py
index 9c9b35c..ba6b455 100644
--- a/src/soil/stream.py
+++ b/src/soil/stream.py
@@ -129,7 +129,7 @@ class Job(ABC):
 
             # replace value
             data.remove((None, Namespaces.qudt.value, None))
-            data.add((measurement_subject, Namespaces.qudt.value, Variable.serialize_value(data, self.value)))
+            data.add((measurement_subject, Namespaces.qudt.value, self.serialize_value(data, self.value)))
 
             # replace timestamp
             data.remove((None, Namespaces.schema.dateCreated, None))
diff --git a/src/soil/variable.py b/src/soil/variable.py
index c0e5934..1838d66 100644
--- a/src/soil/variable.py
+++ b/src/soil/variable.py
@@ -289,8 +289,7 @@ class Variable(Element, ABC):
                 except RangeException as e:
                     raise e
 
-    @staticmethod
-    def serialize_value(data_graph: rdflib.Graph, value: Any) -> rdflib.term.Identifier:
+    def serialize_value(self, data_graph: rdflib.Graph, value: Any) -> rdflib.term.Identifier:
         if isinstance(value, list):
             blank_node = rdflib.BNode()
             data_graph.add((blank_node, Namespaces.rdf.rest, Namespaces.rdf.nil))
@@ -303,7 +302,7 @@ class Variable(Element, ABC):
                 blank_node = new_blank_node
             return blank_node
         else:
-            return rdflib.Literal(value)
+            return rdflib.Literal(value, datatype=self.datatype.to_semantic())
 
     @staticmethod
     def is_scalar(value):
-- 
GitLab