11import threading
22from datetime import timedelta
3- from packaging import version
3+ from perspective import Table as Table_ , View as View_
44from typing import Dict , Optional , Union
55
66import csp
77from csp import ts
8+ from csp .impl .perspective_common import (
9+ date_to_perspective ,
10+ datetime_to_perspective ,
11+ is_perspective3 ,
12+ perspective_type_map ,
13+ )
814from csp .impl .wiring .delayed_node import DelayedNodeWrapperDef
915
1016try :
1420except ImportError :
1521 raise ImportError ("perspective adapter requires tornado package" )
1622
17- try :
18- from perspective import Server , Table as Table_ , View as View_ , __version__ , set_threadpool_size
19-
20- if version .parse (__version__ ) >= version .parse ("3" ):
21- _PERSPECTIVE_3 = True
22- elif version .parse (__version__ ) >= version .parse ("0.6.2" ):
23- from perspective import PerspectiveManager
2423
25- _PERSPECTIVE_3 = False
26- else :
27- raise ImportError ( " perspective adapter requires 0.6.2 or greater of the perspective-python package" )
28- except ImportError :
29- raise ImportError ( " perspective adapter requires 0.6.2 or greater of the perspective-python package" )
24+ _PERSPECTIVE_3 = is_perspective3 ()
25+ if _PERSPECTIVE_3 :
26+ from perspective import Server
27+ else :
28+ from perspective import PerspectiveManager
3029
3130
3231# Run perspective update in a separate tornado loop
@@ -43,12 +42,25 @@ def _apply_updates(table: object, data: {str: ts[object]}, throttle: timedelta):
4342
4443 with csp .state ():
4544 s_buffer = []
45+ s_datetime_cols = set ()
46+ s_date_cols = set ()
4647
4748 with csp .start ():
4849 csp .schedule_alarm (alarm , throttle , True )
50+ if _PERSPECTIVE_3 :
51+ s_datetime_cols = set ([c for c , t in table .schema ().items () if t == "datetime" ])
52+ s_date_cols = set ([c for c , t in table .schema ().items () if t == "date" ])
4953
5054 if csp .ticked (data ):
51- s_buffer .append (dict (data .tickeditems ()))
55+ row = dict (data .tickeditems ())
56+ if _PERSPECTIVE_3 :
57+ for col , value in row .items ():
58+ if col in s_datetime_cols :
59+ row [col ] = datetime_to_perspective (row [col ])
60+ if col in s_date_cols :
61+ row [col ] = date_to_perspective (row [col ])
62+
63+ s_buffer .append (row )
5264
5365 if csp .ticked (alarm ):
5466 if len (s_buffer ) > 0 :
@@ -66,11 +78,13 @@ def _launch_application(port: int, server: object, stub: ts[object]):
6678 s_iothread = None
6779
6880 with csp .start ():
69- from perspective import PerspectiveTornadoHandler
70-
7181 if _PERSPECTIVE_3 :
82+ from perspective .handlers .tornado import PerspectiveTornadoHandler
83+
7284 handler_args = {"perspective_server" : server , "check_origin" : True }
7385 else :
86+ from perspective import PerspectiveTornadoHandler
87+
7488 handler_args = {"manager" : server , "check_origin" : True }
7589 s_app = tornado .web .Application (
7690 [
@@ -205,12 +219,14 @@ def create_table(self, name, limit=None, index=None):
205219 return table
206220
207221 def _instantiate (self ):
208- set_threadpool_size (self ._threadpool_size )
209222 if _PERSPECTIVE_3 :
210223 server = Server ()
211224 client = server .new_local_client ()
212225 thread = threading .Thread (target = perspective_thread , kwargs = dict (client = client ))
213226 else :
227+ from perspective import set_threadpool_size
228+
229+ set_threadpool_size (self ._threadpool_size )
214230 manager = PerspectiveManager ()
215231 thread = threading .Thread (target = perspective_thread , kwargs = dict (manager = manager ))
216232 thread .daemon = True
@@ -221,10 +237,12 @@ def _instantiate(self):
221237 k : v .tstype .typ if not issubclass (v .tstype .typ , csp .Enum ) else str for k , v in table .columns .items ()
222238 }
223239 if _PERSPECTIVE_3 :
240+ psp_type_map = perspective_type_map ()
241+ schema = {col : psp_type_map .get (typ , typ ) for col , typ in schema .items ()}
242+ ptable = client .table (schema , name = table_name , limit = table .limit , index = table .index )
243+ else :
224244 ptable = Table (schema , limit = table .limit , index = table .index )
225245 manager .host_table (table_name , ptable )
226- else :
227- ptable = client .table (schema , name = table_name , limit = table .limit , index = table .index )
228246
229247 _apply_updates (ptable , table .columns , self ._throttle )
230248
0 commit comments