def _write_mutable_params(self, param_dict, write_id, guid): if len(param_dict) < 1: return for param in param_dict: ptype = self.master_manager.parameter_metadata[param].parameter_context.param_type if not ptype.is_mutable and param not in [Span.ingest_time_str, self.alignment_parameter]: raise TypeError("Parameter, %s, is not mutable" % param) time_arr = param_dict[self.alignment_parameter].get_data() time_segment = [time_arr.min(), time_arr.max()] associated_spans = self._get_span_dict(param_dict.keys().remove(self.alignment_parameter), time_segment) new_alignment_arr = param_dict[self.alignment_parameter].get_data() spans_needing_rewrite = set() remove = {} for span in associated_spans: if not span.mutable: continue span_alignment_arr = span.param_dict[self.alignment_parameter].get_data() intersection = np.intersect1d(span_alignment_arr, new_alignment_arr) if intersection.shape[0] < 1: continue intersect_indicies = np.nonzero(intersection)[0] for idx in intersect_indicies: new_idx = np.nonzero(new_alignment_arr == span_alignment_arr[idx]) for param_name, values in param_dict.iteritems(): if param_name in [Span.ingest_time_str, self.alignment_parameter]: continue if param_name in span.param_dict: span.param_dict[param_name].get_data().setflags(write=True) spans_needing_rewrite.add(span) span.param_dict[param_name].get_data()[idx] = param_dict[param_name].get_data()[new_idx] if param_name not in remove: remove[param_name] = [] remove[param_name].append(new_idx[0][0]) if len(remove) > 0: for param , indicies in remove.iteritems(): from copy import deepcopy align_data = deepcopy(param_dict[self.alignment_parameter]) get_data_indicies = range(len(align_data.get_data())) from collections import deque deque((list.pop(get_data_indicies, i) for i in sorted(indicies, reverse=True)), maxlen=0) if len(get_data_indicies) > 0: span_dict = {} align_data._data = align_data.get_data()[get_data_indicies] span_dict[self.alignment_parameter] = align_data param_dict[param]._data = param_dict[param].get_data()[get_data_indicies] span_dict[param] = param_dict[param] span = Span(write_id+'_'+param, guid, span_dict, compressors=self.value_list, mutable=True) spans_needing_rewrite.add(span) param_dict.pop(param) span_table = SpanStorageFactory.get_span_storage_obj(self.storage_name) if len(param_dict) > 2: # observation time and ingest time span = Span(write_id, guid, param_dict, compressors=self.value_list, mutable=True) span_table.write_span(span) for span in spans_needing_rewrite: span.compressors = self.value_list span_table.write_span(span)