From a31922db8c020ab4e35086214bafc57fc557d60a Mon Sep 17 00:00:00 2001
From: Romain Broucquart <romain.broucquart@synchrotron-soleil.fr>
Date: Fri, 26 Jun 2020 17:13:30 +0200
Subject: [PATCH] [ArchiveExtractor] Utilisation de la fonction
 ExtractBetweenDates
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Plutôt que GetAttDataBetweenDate
* Evite la création d'un attribut dynamique
* Permet une résolution temporelle sub-seconde
---
 ArchiveExtractor.py | 23 +++++++----------------
 1 file changed, 7 insertions(+), 16 deletions(-)

diff --git a/ArchiveExtractor.py b/ArchiveExtractor.py
index 022b226..d187930 100755
--- a/ArchiveExtractor.py
+++ b/ArchiveExtractor.py
@@ -23,6 +23,7 @@ DBDFMT = "%Y-%m-%d %H:%M:%S"
 # Extractor date format for GetNearestValue
 DBDFMT2 = "%d-%m-%Y %H:%M:%S"
 
+ArrayTimeStampToDatetime = np.vectorize(datetime.datetime.fromtimestamp)
 
 ##---------------------------------------------------------------------------##
 def dateparse(datestr):
@@ -76,7 +77,7 @@ def query_ADB_BetweenDates(attr,
               extractor="archiving/TDBExtractor/4"):
     """
     Query attribute data from an archiver database, get all points between dates.
-    Use GetAttDataBetweenDates.
+    Use ExtractBetweenDates.
     Warning : if the time interval gives a huge set of data, it can stall.
 
     Parameters
@@ -152,32 +153,22 @@ def query_ADB_BetweenDates(attr,
     # For each date chunk
     for i_d in range(len(cdates)-1):
         # Make retrieval request
-        logger.debug("Perform GetAttDataBetweenDates (%s, %s, %s)"%(
+        logger.debug("Perform ExtractBetweenDates (%s, %s, %s)"%(
             attr,
             cdates[i_d].strftime(DBDFMT),
             cdates[i_d+1].strftime(DBDFMT))
             )
 
-        [N,], [name,] = ADB.GetAttDataBetweenDates([
+        _date, _value = ADB.ExtractBetweenDates([
             attr,
             cdates[i_d].strftime(DBDFMT),
             cdates[i_d+1].strftime(DBDFMT)
             ])
 
-        # Read the history
-        logger.debug("Retrieve hystory of %d values. Dynamic attribute named %s."%(N, name))
-        attrHist = ADB.attribute_history(name, N)
-
         # Transform to datetime - value arrays
-        _value = np.empty(N, dtype=float)
-        _date = np.empty(N, dtype=object)
-        for i_h in range(N):
-            _value[i_h]=attrHist[i_h].value
-            _date[i_h]=attrHist[i_h].time.todatetime()
-
-        # Remove dynamic attribute
-        logger.debug("Remove dynamic attribute %s."%name)
-        ADB.RemoveDynamicAttribute(name)
+        _value = np.asarray(_value, dtype=float)
+        if len(_date) > 0:
+            _date = ArrayTimeStampToDatetime(_date/1000.0)
 
         value.append(_value)
         date.append(_date)
-- 
GitLab