Skip to content

Commit b3f5af0

Browse files
author
Francisco Arrieta
committed
Fixed bugs when sorting columns and in series service
In series_service.py add try except to some methods to prevent errors. Next, when clicking on a column the data was not being sorted correctly because of the previous changes. Last, optimized the merge_annotation method
1 parent 23750c6 commit b3f5af0

2 files changed

Lines changed: 56 additions & 60 deletions

File tree

odmtools/controller/olvDataTable.py

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(self, parent, **kwargs):
2121
self.currentItem = None
2222
self.dataframe = None
2323
self.annotations = None
24-
self.data = None
24+
self.annotations_grouped = {}
2525

2626
def init(self, memDB):
2727
self.memDB = memDB
@@ -31,17 +31,15 @@ def init(self, memDB):
3131

3232
self.dataframe = self.memDB.getDataValuesDF()
3333
self.annotations = self.memDB.get_annotations()
34-
# sort_by_index = list(self.dataframe.columns).index("valuedatetime")
35-
# columns = self.memDB.get_columns_with_annotations()
36-
# self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
37-
# self.dataObjects = self.dataframe.values.tolist()
34+
35+
sort_by_index = self.dataframe.columns.tolist().index("valuedatetime")
36+
self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
37+
38+
self.annotations_grouped = self.__group_annotations()
3839
self.dataObjects = self.__merge_dataframe_with_annotations()
40+
3941
col = self.memDB.get_columns_with_annotations()
4042

41-
# columns = \
42-
# [ColumnDefn(x.strip(), align="left", valueGetter=i, minimumWidth=125, width=125,
43-
# stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
44-
# for x, i in self.memDB.getEditColumns()]
4543
columns = \
4644
[ColumnDefn(x.strip(), align="left", valueGetter=i, minimumWidth=125, width=125,
4745
stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
@@ -51,16 +49,27 @@ def init(self, memDB):
5149

5250

5351
self.SetObjectGetter(self.ObjectGetter)
54-
self.SetItemCount(len(self.dataframe))
52+
self.SetItemCount(len(self.dataObjects))
5553

5654
def __merge_dataframe_with_annotations(self):
57-
sort_by_index = self.dataframe.columns.tolist().index("valuedatetime")
58-
self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
59-
6055
data_list = self.dataframe.values.tolist()
61-
anno_list = self.annotations.values.tolist()
6256
data = data_list
6357

58+
for key, value in self.annotations_grouped.iteritems():
59+
for i in range(0, len(data_list)):
60+
if key in data[i]:
61+
data[i].append(value)
62+
break
63+
64+
return data
65+
66+
def __group_annotations(self):
67+
"""
68+
Ideally, this method should only be called once. Use self.grouped_annotations after calling this method
69+
:return:
70+
"""
71+
anno_list = self.annotations.values.tolist()
72+
6473
anno = {}
6574
for i in range(0, len(anno_list)):
6675
value_id = anno_list[i][1]
@@ -70,16 +79,10 @@ def __merge_dataframe_with_annotations(self):
7079
else:
7180
anno[value_id] = [annotation_code]
7281

73-
for key, value in anno.iteritems():
74-
for i in range(0, len(data_list)):
75-
if key in data_list[i]:
76-
data_list[i].append(value)
77-
break
78-
79-
return data
82+
return anno
8083

8184
def EnableSorting(self):
82-
self.Bind(wx.EVT_LIST_COL_CLICK, self.onColSelected)
85+
self.Bind(wx.EVT_LIST_COL_CLICK, self.on_column_selected)
8386
if not self.smallImageList:
8487
self.SetImageLists()
8588
if (not self.smallImageList.HasName(ObjectListView.NAME_DOWN_IMAGE) and
@@ -93,35 +96,34 @@ def ObjectGetter(self, index):
9396
"""
9497
return self.dataObjects[index % len(self.dataObjects)]
9598

96-
def onColSelected(self, evt):
99+
def on_column_selected(self, event):
97100
"""
98101
Allows users to sort by clicking on columns
99102
"""
100-
if isinstance(self.dataframe, pd.DataFrame):
101-
if self.dataframe.empty:
102-
return
103-
else:
104-
if not self.dataframe:
105-
return
103+
if not isinstance(self.dataframe, pd.DataFrame):
104+
return
105+
106+
if self.dataframe.empty:
107+
return
106108

107-
logger.debug("Column: %s" % evt.m_col)
108-
self.sortColumn(evt.m_col)
109+
if not len(self.dataObjects):
110+
return
111+
112+
self.sortColumn(event.Column)
109113

110114
def sortColumn(self, selected_column):
111115
oldSortColumnIndex = self.sortedColumnIndex
112116
self.sortedColumnIndex = selected_column
113-
ascending = self.sortAscending
114-
if ascending:
115-
self.dataframe.sort_values(self.dataframe.columns[selected_column], inplace=True)
116-
self.sortAscending = False
117-
elif not ascending:
118-
self.dataframe.sort_values(self.dataframe.columns[selected_column], ascending=False, inplace=True)
119-
self.sortAscending = True
117+
118+
self.sortAscending = not self.sortAscending
119+
self.dataframe.sort_values(self.dataframe.columns[selected_column], ascending=self.sortAscending, inplace=True)
120120

121121
self._UpdateColumnSortIndicators(selected_column, oldSortColumnIndex)
122122

123-
self.dataObjects = self.dataframe.values.tolist()
124-
if self.GetItemCount:
123+
# self.dataObjects = self.dataframe.values.tolist()
124+
self.dataObjects = self.__merge_dataframe_with_annotations()
125+
126+
if self.GetItemCount():
125127
itemFrom = self.GetTopItem()
126128
itemTo = self.GetTopItem() + 1 + self.GetCountPerPage()
127129
itemTo = min(itemTo, self.GetItemCount() - 1)

odmtools/odmservices/series_service.py

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,6 @@ def get_values(self, series_id=None):
378378
# newdf.drop(['_merge'], axis=1, inplace=True)
379379
# return df[df['valuedatetime'].isin(newdf['valuedatetime'])]
380380

381-
# def merge_annotation_with_timeseries_result(self, x):
382-
# print x
383-
#
384-
# # return x
385-
# return 123
386-
def merge_annotation_with_timeseries_result(self, data, anno):
387-
388-
print 123
389-
return
390-
391381
def get_all_values_df(self):
392382

393383
"""
@@ -863,20 +853,24 @@ def get_quality_code(self):
863853
return self.read.getCVs(type="Quality Code")
864854

865855
def get_annotation_by_code(self, code):
866-
return self.read.getAnnotations(codes=[code])[0]
856+
try:
857+
return self.read.getAnnotations(codes=[code])[0]
858+
except:
859+
return None
860+
867861
def get_annotation_by_id(self, id):
868-
return self.read.getAnnotations(ids=[id])[0]
862+
try:
863+
return self.read.getAnnotations(ids=[id])[0]
864+
except:
865+
return None
866+
869867
def get_all_annotations(self):
870-
return self.read.getAnnotations(type=None)
868+
try:
869+
return self.read.getAnnotations(type=None)
870+
except:
871+
return None
871872

872873
def get_annotations_by_result(self, resultid):
873-
# setSchema(self._session_factory.engine)
874-
875-
# ids = [x[0] for x in self.read._session.query(TimeSeriesResultValues.ValueID)\
876-
# .filter(TimeSeriesResultValues.ResultID == resultid).all()]
877-
# q = self.read._session.query(TimeSeriesResultValueAnnotations)\
878-
# .filter(TimeSeriesResultValueAnnotations.ValueID.in_(ids)).all()
879-
880874
resultid = int(resultid)
881875

882876
q = self.read._session.query(TimeSeriesResultValueAnnotations.AnnotationID, TimeSeriesResultValueAnnotations.ValueID,

0 commit comments

Comments
 (0)