Skip to content

Commit 8e9b140

Browse files
author
stephanie
committed
improve editing functions - update values, upsert values
1 parent 06a73b6 commit 8e9b140

6 files changed

Lines changed: 135 additions & 105 deletions

File tree

odmtools/controller/logicEditTools.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ def restore(self):
222222
self._script("edit_service.restore()\n", 'black')
223223
Publisher.sendMessage("scroll")
224224

225-
def saveFactory(self, var=None, method=None, qcl=None):
225+
def saveFactory(self, var=None, method=None, qcl=None, action= None, actionby= None):
226226
"""
227227
228228
:param var:
@@ -236,7 +236,7 @@ def saveFactory(self, var=None, method=None, qcl=None):
236236
values['method'] = ("new_method" if method else None)
237237
values['qcl'] = ("new_qcl" if qcl else None)
238238
#values['override'] = override
239-
return values['var'], values['method'], values['qcl']#, values['isSave']
239+
return values['var'], values['method'], values['qcl'], action, actionby#, values['isSave']
240240

241241

242242
def save(self, var=None, method=None, qcl=None):
@@ -257,7 +257,7 @@ def save(self, var=None, method=None, qcl=None):
257257
Publisher.sendMessage("scroll")
258258
return result
259259

260-
def save_as(self, var=None, method=None, qcl=None):
260+
def save_as(self, var=None, method=None, qcl=None, action = None, actionby = None):
261261
"""
262262
263263
:param var:
@@ -266,16 +266,16 @@ def save_as(self, var=None, method=None, qcl=None):
266266
:param override:
267267
:return:
268268
"""
269-
result = self._edit_service.save_as(var=var, method=method, qcl=qcl)
269+
result = self._edit_service.save_as(var=var, method=method, qcl=qcl, action = action, actionby = actionby)
270270
if self._record:
271271
self._script(
272-
"edit_service.save_as(%s, %s, %s)\n" % (self.saveFactory(var, method, qcl)),
272+
"edit_service.save_as(%s, %s, %s, %s, %s)\n" % (self.saveFactory(var, method, qcl, action, actionby)),
273273
'black')
274274
#self._script("edit_service.save(%s, %s, %s, saveAs=%s)\n" % (var, method, qcl, isSave), 'black')
275275
Publisher.sendMessage("scroll")
276276
return result
277277

278-
def save_appending(self, var = None, method =None, qcl = None, overwrite = False):
278+
def save_appending(self, result = None, overwrite = False):
279279
"""
280280
281281
:param var:
@@ -284,14 +284,14 @@ def save_appending(self, var = None, method =None, qcl = None, overwrite = False
284284
:param override:
285285
:return:
286286
"""
287-
result = self._edit_service.save_appending(var=var, method=method, qcl=qcl, overwrite= overwrite)
287+
result = self._edit_service.save_appending(result= result, overwrite= overwrite)
288288
if result:
289289
print "Save worked!"
290290

291291
if self._record:
292292

293293
self._script(
294-
"edit_service.save_appending(%s, %s, %s, " % self.saveFactory(var, method, qcl)+str(overwrite )+")\n",
294+
"edit_service.save_appending(%s, %s)\n" % (result, str(overwrite )),
295295
'black')
296296
#self._script("edit_service.save(%s, %s, %s, saveAs=%s)\n" % (var, method, qcl, isSave), 'black')
297297
Publisher.sendMessage("scroll")
@@ -302,7 +302,7 @@ def save_appending(self, var = None, method =None, qcl = None, overwrite = False
302302
return result
303303

304304

305-
def save_existing(self, var=None, method=None, qcl=None):
305+
def save_existing(self, result=None):
306306
"""
307307
308308
:param var:
@@ -311,14 +311,14 @@ def save_existing(self, var=None, method=None, qcl=None):
311311
:param override:
312312
:return:
313313
"""
314-
result = self._edit_service.save_existing(var=var, method=method, qcl=qcl)
314+
result = self._edit_service.save_existing(result = result)
315315
if result:
316316
print "Save worked!"
317317

318318
if self._record:
319319

320320
self._script(
321-
"edit_service.save_existing(%s, %s, %s)\n" % (self.saveFactory(var, method, qcl)),
321+
"edit_service.save_existing(%s)\n" % (result),
322322
'black')
323323
#self._script("edit_service.save(%s, %s, %s, saveAs=%s)\n" % (var, method, qcl, isSave), 'black')
324324
Publisher.sendMessage("scroll")

odmtools/controller/pageExisting.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ def enableButtons(self, isEnabled):
7070

7171
def get_selected_series(self):
7272
selectedObject = self.pnlExisting.olvSeriesList.GetSelectedObject()
73-
result = self.series_service.get_series(selectedObject.ResultID)
74-
return result.FeatureActionObj.ActionObj.MethodObj, result.ProcessingLevelObj, result.VariableObj
73+
result = selectedObject.ResultObj#self.series_service.get_series(selectedObject.ResultID)
74+
return result.FeatureActionObj.ActionObj.MethodObj, result.ProcessingLevelObj, result.VariableObj, result
7575

7676
def initTable(self, dbservice, site_id):
7777
"""Set up columns and objects to be used in the objectlistview to be visible in the series_service selector"""

odmtools/gui/wizSave.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ def get_metadata(self):
262262

263263
elif self.pgIntro.pnlIntroduction.rbSaveExisting.GetValue():
264264
# selected an existing series
265-
method, processing_level, variable = self.pgExisting.get_selected_series()
265+
method, processing_level, variable, result = self.pgExisting.get_selected_series()
266266

267267
# Create action
268268
action = Actions()
@@ -460,25 +460,27 @@ def on_wizard_finished(self, event):
460460
action_by.AffiliationObj = affiliation
461461

462462
# result = self.series_service.getResult(var=variable, meth=method, proc=proc_level, action=action, actionby=action_by)
463-
result = self.record_service._edit_service.getResult(var=variable, meth=method, proc=proc_level, action=action, actionby=action_by)
463+
result = self.pgExisting.pnlExisting.olvSeriesList.GetSelectedObject().ResultObj
464+
465+
#result = self.record_service._edit_service.getResult(var=variable, meth=method, proc=proc_level, action=action, actionby=action_by)
464466

465467
try:
466468
if rbSave:
467469
result = self.record_service.save()
468470
elif rbSaveAsNew:
469-
result = self.record_service.saveAs(variable=variable, method=method, proc_level=proc_level,
471+
result = self.record_service.save_as(variable=variable, method=method, proc_level=proc_level,
470472
action=action, action_by=action_by)
471473
elif rbSaveAsExisting:
472474
if overwrite:
473-
result = self.record_service.saveExisting(result=result)
475+
result = self.record_service.save_existing(result=result)
474476
elif append:
475477
#TODO send in just the result
476478
#def save_appending(self, var = None, method =None, qcl = None, overwrite = False):
477479
#TODO if i require that original or new is selected I can call once with overwrite = original
478480
if original:
479-
result = self.record_service.saveAppend(result=result, overwrite=False)
481+
result = self.record_service.save_appending(result=result, overwrite=False)
480482
elif new:
481-
result = self.record_service.saveAppend(result=result, overwrite=True)
483+
result = self.record_service.save_appending(result=result, overwrite=True)
482484

483485
Publisher.sendMessage("refreshSeries")
484486

odmtools/odmservices/edit_service.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -483,20 +483,24 @@ def restore(self):
483483
self.reset_filter()
484484

485485
def save(self, result=None):
486-
values = self.memDB.df
486+
values = self.memDB.getDataValuesDF()
487+
487488
if not result:
488489
result = self.memDB.series_service.get_series(series_id = values['resultid'][0])
490+
else:
491+
values["resultid"] = result.ResultID
492+
489493
# update result
490494
result.ValueCount = 0
491495
self.updateResult(result)
492496
# upsert values
493-
self.memDB.series_service.upsert(values)
497+
self.memDB.series_service.upsert_values(values)
494498
# save new annotations
495499
self.add_annotations(self.memDB.annotation_list)
496500
return result
497501

498-
def saveAppend(self, result, overwrite=True):
499-
values = self.memDB.df
502+
def save_appending(self, result, overwrite=True):
503+
values = self.memDB.getDataValuesDF()
500504

501505
# get save result
502506

@@ -517,22 +521,21 @@ def saveAppend(self, result, overwrite=True):
517521
return result
518522

519523

520-
def saveExisting(self, result):
521-
values = self.memdB.df
524+
def save_existing(self, result):
525+
#values = self.memDB.getDataValuesDF()
522526
# get save result
523527

524528
# set in df
525-
values["resultid"]=result.ResultID
529+
#values["resultid"]=result.ResultID
526530

527531
# save(values)
528532
self.save(result)
529-
#self.memDB.series_service.upsert_values(values)
530533

531534
return result
532535

533-
def saveAs(self, variable, method, proc_level, action, action_by):
536+
def save_as(self, variable, method, proc_level, action, action_by):
534537
#save as new series
535-
values = self.memDB.df
538+
values = self.memDB.getDataValuesDF()
536539
# get all annotations for series
537540
annolist= self.memDB.series_service.get_annotations_by_result(values["resultid"][0])
538541
annolist['valueid']
@@ -555,9 +558,9 @@ def saveAs(self, variable, method, proc_level, action, action_by):
555558
return result
556559

557560
def getResult(self, var, meth, proc, action, actionby):
558-
561+
values = self.memDB.getDataValuesDF()
559562
# copy old
560-
result = self.memDB.series_service.get_series(self.memDB.df["resultid"][0])
563+
result = self.memDB.series_service.get_series(values["resultid"][0])
561564
sampling_feature = result.FeatureActionObj.SamplingFeatureObj
562565
# self.memDB.series_service._session.expunge(result)
563566

@@ -595,7 +598,7 @@ def getResult(self, var, meth, proc, action, actionby):
595598
def updateResult(self, Result):
596599
form = "%Y-%m-%d %H:%M:%S"
597600
# get pd
598-
values = self.memDB.df
601+
values = self.memDB.getDataValuesDF()
599602

600603
# update count, dates,
601604
Action = Result.FeatureActionObj.ActionObj

odmtools/odmservices/series_service.py

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from odm2api.ODM2.services import ReadODM2, UpdateODM2, DeleteODM2, CreateODM2
44
from odm2api import serviceBase
55
from odm2api.ODM2.models import *
6-
from odmtools.odmservices.to_sql_newrows import clean_df_db_dups, delete, update
6+
from odmtools.odmservices.to_sql_newrows import get_insert, get_delete, get_update
77
import datetime
88
from odmtools.common.logger import LoggerTool
99
import pandas as pd
@@ -624,47 +624,69 @@ def get_current_time_and_utcoffset(self):
624624
# return True
625625

626626

627-
def update_values(self, updates):
628-
'''
629-
updates : time series result values, pandas dataframe
630-
'''
631-
setSchema(self.mem_service._session_factory.engine)
632627

633-
stmt = (TimeSeriesResultValues.__table__.update().
634-
where(TimeSeriesResultValues.ValueDateTime == bindparam('id')).
635-
values(datavalue=bindparam('value'))
636-
)
637628

638-
self.create._session.execute(stmt, updates["datavalue"].to_dict(orient='dict'))
639-
#self.mem_service._session.query(TSRV).filter_by
640629

641-
# self.updateDF()
642630

643631
def insert_annotations(self, annotations):
644632
annotations.to_sql(name="timeseriesresultvalueannotations", if_exists='append', con=self._session_factory.engine, index=False)
645633

634+
def _get_df_query(self, values):
635+
636+
resid = str(values['resultid'][0])
637+
sd = values['valuedatetime'].min()
638+
ed = values['valuedatetime'].max()
639+
q = self.read._session.query(TimeSeriesResultValues).\
640+
filter(TimeSeriesResultValues.ResultID == resid)#.\
641+
#filter(TimeSeriesResultValues.ValueDateTime.between(sd, ed))
642+
return q.statement.compile(dialect=self._session_factory.engine.dialect)
643+
646644

647645
def upsert_values(self, values):
648646
setSchema(self._session_factory.engine)
649-
newvals= clean_df_db_dups(df = values, dup_cols = ["valuedatetime", "resultid"], tablename="timeseriesresultvalues", engine = self._session_factory.engine,
650-
filter_continuous_col="valuedatetime", filter_categorical_col="resultid")
651-
self.insert_values(newvals)
652-
delvals = delete(df = values, dup_cols = ["valuedatetime", "resultid"], tablename="timeseriesresultvalues", engine = self._session_factory.engine,
653-
filter_continuous_col = "valuedatetime", filter_categorical_col = "resultid")
654-
self.delete_dvs(delvals["valuedatetime"])
647+
query = self._get_df_query(values)
648+
newvals= get_insert(df = values, query = query, dup_cols = ["valuedatetime", "resultid"], engine = self._session_factory.engine)
649+
if not newvals.empty:
650+
self.insert_values(newvals)
651+
delvals = get_delete(df = values, query = query, dup_cols = ["valuedatetime", "resultid"], engine = self._session_factory.engine)
652+
if not delvals.empty:
653+
self.delete_dvs(delvals["valuedatetime"].tolist())
655654

656-
upvals = update(df = values,dup_cols = ["valuedatetime", "resultid"], tablename="timeseriesresultvalues", engine = self._session_factory.engine,
657-
filter_continuous_col="valuedatetime", filter_categorical_col="resultid")
658-
self.update(upvals)
655+
upvals = get_update(df = values, query = query, dup_cols = ["valuedatetime", "resultid"], engine = self._session_factory.engine)
656+
if not upvals.empty:
657+
self.update_values(upvals)
658+
659+
self._session.commit()
659660

660661
def insert_values(self, values):
661662
"""
662663
663664
:param values: pandas dataframe
664665
:return:
665666
"""
666-
values.to_sql(name="timeseriesresultvalues", if_exists='append', con=self._session_factory.engine, index=False)
667-
#
667+
values.to_sql(name="TimeSeriesResultValues",
668+
schema=TimeSeriesResultValues.__table_args__['schema'],
669+
if_exists='append',
670+
chunksize=1000,
671+
con=self._session_factory.engine,
672+
index=False)
673+
674+
675+
def update_values(self, updates):
676+
'''
677+
updates : time series result values, pandas dataframe
678+
'''
679+
setSchema(self._session_factory.engine)
680+
681+
stmt = (TimeSeriesResultValues.__table__.update().
682+
where(TimeSeriesResultValues.ValueDateTime == bindparam('id')).
683+
values(datavalue=bindparam('value'))
684+
)
685+
update_list = [{"value": row["datavalue"], "id": index.to_pydatetime()} for index, row in updates.iterrows()]
686+
# update_list = {'value':updates["datavalue"].tolist(), 'id':updates.index.to_pydatetime().tolist()}
687+
vals = self.create._session.execute(stmt, update_list)
688+
689+
668690
# def create_new_series(self, data_values, site_id, variable_id, method_id, source_id, qcl_id):
669691
# """
670692
#

0 commit comments

Comments
 (0)