@ -8,27 +8,58 @@
"""
import transport
import os
from multiprocessing import Process
from multiprocessing import Process , Lock
import numpy as np
import json
import pandas as pd
class Subject ( Process ) :
cache = pd . DataFrame ( )
lock = Lock ( )
@staticmethod
def log ( _args ) :
Subject . lock . acquire ( )
try :
Subject . cache = Subject . cache . append ( pd . DataFrame ( [ _args ] ) )
except Exception as e :
print ( e )
finally :
Subject . lock . release ( )
def __init__ ( self , * * _args ) :
super ( ) . __init__ ( )
self . observers = _args [ ' observers ' ]
self . index = 0
self . name = _args [ ' name ' ]
self . table = self . observers [ 1 ] . table
self . m = { }
pass
def run ( self ) :
self . notify ( )
def notify ( self ) :
if self . index < len ( self . observers ) :
observer = self . observers [ self . index ]
_observer = None if self . index == 0 else self . observers [ self . index - 1 ]
_invalues = None if not _observer else _observer . get ( )
if _observer is None :
self . m [ ' table ' ] = self . name
observer . init ( caller = self , invalues = _invalues )
self . index + = 1
observer . execute ( )
print ( { " table " : self . table , " module " : observer . name ( ) , " status " : observer . status } )
# self.m[observer.name()] = observer.status
else :
pass
class Worker :
def __init__ ( self , * * _args ) :
@ -38,6 +69,7 @@ class Worker :
self . logs = [ ]
self . schema = _args [ ' schema ' ]
self . prefix = _args [ ' prefix ' ]
self . status = 0
def name ( self ) :
return self . __class__ . __name__
@ -45,7 +77,7 @@ class Worker :
"""
This function is designed to log to either the console or a data - store
"""
print ( _args )
# print (_args )
pass
def init ( self , * * _args ) :
"""
@ -60,9 +92,10 @@ class Worker :
try :
self . _apply ( )
except Exception as error :
print ( )
print ( error )
print ( )
pass
# print ()
# print (error)
# print ()
finally :
self . caller . notify ( )
@ -101,10 +134,12 @@ class CreateSQL(Worker) :
writer . apply ( self . _sql . replace ( " :table " , sqltable ) )
writer . close ( )
log [ ' status ' ] = 1
self . status = 1
except Exception as e :
log [ ' status ' ] = 0
log [ ' info ' ] = { " error " : e . args [ 0 ] }
print ( e )
# print (e)
finally :
self . log ( * * log )
@ -141,25 +176,28 @@ class Reader(Worker):
self . rows = [ ]
def _apply ( self ) :
self . reader = transport . factory . instance ( * * self . _info ) ;
print ( )
print ( self . table )
print ( json . dumps ( self . pipeline ) )
print ( )
self . rows = self . reader . read ( mongo = self . pipeline )
try :
self . reader = transport . factory . instance ( * * self . _info ) ;
self . rows = self . reader . read ( mongo = self . pipeline )
N = len ( self . rows ) / self . MAX_ROWS if len ( self . rows ) > self . MAX_ROWS else 1
N = int ( N )
# self.rows = rows
_log = { " context " : self . name ( ) , " args " : self . _info [ ' args ' ] [ ' db ' ] , " status " : 1 , " info " : { " rows " : len ( self . rows ) , " table " : self . table , " segments " : N } }
self . rows = np . array_split ( self . rows , N )
N = len ( self . rows ) / self . MAX_ROWS if len ( self . rows ) > self . MAX_ROWS else 1
N = int ( N )
# self.rows = rows
_log = { " context " : self . name ( ) , " args " : self . _info [ ' args ' ] [ ' db ' ] , " status " : 1 , " info " : { " rows " : len ( self . rows ) , " table " : self . table , " segments " : N } }
self . rows = np . array_split ( self . rows , N )
# self.get = lambda : rows #np.array_split(rows,N)
self . reader . close ( )
self . status = 1
#
except Exception as e :
log [ ' status ' ] = 0
log [ ' info ' ] = { " error " : e . args [ 0 ] }
# self.get = lambda : rows #np.array_split(rows,N)
self . reader . close ( )
#
self . log ( * * _log )
# @TODO: Call the caller and notify it that this here is done
def get ( self ) :
return self . rows
@ -201,8 +239,8 @@ class Writer(Worker):
# for _e in rows :
# writer.write(_e)
self . status = 1
else :
print ( " No data was passed " )