api/find: extend to federated instances
2 files changed, 38 insertions(+), 9 deletions(-)

M test/test_api.py
M tshistory/api.py
M test/test_api.py +26 -0
@@ 965,6 965,32 @@ def test_federated_basket(mapi):
     ]
 
 
+def test_federated_find(mapi):
+    ts = pd.Series(
+        [1, 2, 3],
+        pd.date_range(utcdt(2023, 1, 1), freq='D', periods=3)
+    )
+    mapi.update(
+        'local.basket.fed',
+        ts,
+        'Babar'
+    )
+
+    remoteapi = timeseries(mapi.uri, 'ns-test-mapi-2')
+    remoteapi.update(
+        'remote.basket.fed',
+        ts,
+        'Celeste'
+    )
+
+
+    names = mapi.find('(byname "basket.fed")')
+    assert names == [
+        'local.basket.fed',
+        'remote.basket.fed'
+    ]
+
+
 # groups
 
 def test_primary_group(tsx):

          
M tshistory/api.py +12 -9
@@ 541,12 541,15 @@ class mainsource:
 
         """
         if isinstance(query, str):
-            q = search.query.fromexpr(query)
+            qexpr = search.query.fromexpr(query)
         else:
-            q = query
-        assert isinstance(q, search.query)
+            qexpr = query
         with self.engine.begin() as cn:
-            return self.tsh.find(cn, q)
+            localnames = self.tsh.find(cn, qexpr)
+        remotenames = self.othersources.find(query)
+        return sorted(
+            localnames + remotenames
+        )
 
     def interval(self, name: str) -> pd.Interval:
         """Return a pandas interval object which provides the smallest and

          
@@ 706,7 709,7 @@ class mainsource:
         """Returns the list of series names associated with a basket."""
         with self.engine.begin() as cn:
             localnames = self.tsh.basket(cn, name)
-        remotenames = self.othersources.baskets(
+        remotenames = self.othersources.find(
             self.basket_definition(name)
         )
         return sorted(

          
@@ 1050,13 1053,13 @@ class altsources:
             cat.update(c)
         return cat
 
-    def baskets(self, query):
-        baskets = []
+    def find(self, query):
+        nameslist = []
         pool = threadpool(len(self.sources))
 
         def readbasket(source):
             try:
-                baskets.append(
+                nameslist.append(
                     source.tsa.find(query)
                 )
             except:

          
@@ 1065,5 1068,5 @@ class altsources:
 
         pool(readbasket, [(s,) for s in self.sources])
         return list(
-            itertools.chain.from_iterable(baskets)
+            itertools.chain.from_iterable(nameslist)
         )