fix(pkg/logfile): compression for measured values
This commit is contained in:
		| @@ -26,6 +26,10 @@ func (jl *jsonLogfile) Append(compression bool, measuredValues []types.MeasuredV | ||||
|  | ||||
| 	allMeasuredValues = append(allMeasuredValues, measuredValues...) | ||||
|  | ||||
| 	if compression { | ||||
| 		allMeasuredValues = Compression(allMeasuredValues) | ||||
| 	} | ||||
|  | ||||
| 	err = jl.Write(allMeasuredValues) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -56,6 +60,11 @@ func (jl *jsonLogfile) Read() ([]types.MeasuredValue, error) { | ||||
| 	measuredValues := make([]types.MeasuredValue, 0) | ||||
|  | ||||
| 	for _, unmarshaledMeasuredValue := range unmarshaledMeasuredValues { | ||||
|  | ||||
| 		if unmarshaledMeasuredValue == nil { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		mappedMeasuredValue, ok := unmarshaledMeasuredValue.(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 			log.Println("Can not parse into map") | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package logfile | ||||
|  | ||||
| import ( | ||||
| 	"path/filepath" | ||||
| 	"sort" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/go-flucky/flucky/pkg/types" | ||||
| @@ -10,44 +11,60 @@ import ( | ||||
| // var validUUID = regexp.MustCompile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$") | ||||
| var timeFormat = time.RFC3339 | ||||
|  | ||||
| // CompressTemperature compresses the temperatures from an array. It is checked | ||||
| // whether the measured temperature of a value corresponds to that of the | ||||
| // predecessor. If this is the case, the current value is discarded and the | ||||
| // validity date of the predecessor value is set to that of the current value. | ||||
| // No information is lost as a result. The validity period of the measured value | ||||
| // is thereby exclusively increased. | ||||
| // func Compression(measuredValues []types) []*types.Temperature { | ||||
| // 	compressedTemperatures := make([]*types.Temperature, 0) | ||||
| // 	lastTemperatureBySensors := make(map[string]*types.Temperature, 0) | ||||
| // Compression the measured values. The system checks whether the measured values | ||||
| // of the same type correspond to those of the predecessor. If this is the case, | ||||
| // the current value is discarded and the validity date of the previous value is | ||||
| // set to that of the current value. This means that no information is lost. | ||||
| // Only the validity period of the measured value is increased. | ||||
| func Compression(measuredValues []types.MeasuredValue) []types.MeasuredValue { | ||||
| 	compressedMeasuredValues := make([]types.MeasuredValue, 0) | ||||
| 	lastMeasuredValuesBySensors := make(map[string]map[types.MeasuredValueType]types.MeasuredValue, 0) | ||||
|  | ||||
| // 	// Sort all measured temperatures beforehand by the starting validity date to | ||||
| // 	// avoid errors when compressing the temperatures. | ||||
| // 	SortTemperatures(temperatures) | ||||
| 	// Sort all measured values according to the start time of the validity date | ||||
| 	// in order to successfully implement the subsequent compression. | ||||
| 	sort.SliceStable(measuredValues, func(i int, j int) bool { | ||||
| 		return measuredValues[i].GetFromDate().Before(measuredValues[j].GetFromDate()) | ||||
| 	}) | ||||
|  | ||||
| // 	for _, temperature := range temperatures { | ||||
| // 		if lastTemperatureBySensor, ok := lastTemperatureBySensors[temperature.SensorID]; ok { | ||||
| // 			if lastTemperatureBySensor.TemperatureValue == temperature.TemperatureValue { | ||||
| 	now := time.Now() | ||||
|  | ||||
| // 				lastTemperatureBySensors[temperature.SensorID].TemperatureTillDate = temperature.TemperatureTillDate | ||||
| 	for _, measuredValue := range measuredValues { | ||||
| 		if _, ok := lastMeasuredValuesBySensors[measuredValue.GetSensorID()]; !ok { | ||||
| 			lastMeasuredValuesBySensors[measuredValue.GetSensorID()] = make(map[types.MeasuredValueType]types.MeasuredValue, 0) | ||||
| 		} | ||||
|  | ||||
| // 				now := time.Now() | ||||
| // 				lastTemperatureBySensors[temperature.SensorID].UpdateDate = &now | ||||
| // 			} else { | ||||
| // 				compressedTemperatures = append(compressedTemperatures, lastTemperatureBySensors[temperature.SensorID]) | ||||
| // 				lastTemperatureBySensors[temperature.SensorID] = temperature | ||||
| // 			} | ||||
| // 		} else { | ||||
| // 			lastTemperatureBySensors[temperature.SensorID] = temperature | ||||
| // 		} | ||||
| // 	} | ||||
| 		if _, ok := lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()]; !ok { | ||||
| 			lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()] = measuredValue | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| // 	// Copy all remaining entries from the map into the array | ||||
| // 	for _, lastTemperatureBySensor := range lastTemperatureBySensors { | ||||
| // 		compressedTemperatures = append(compressedTemperatures, lastTemperatureBySensor) | ||||
| // 	} | ||||
| 		if lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].GetValue() == measuredValue.GetValue() { | ||||
| 			lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].SetTillDate(measuredValue.GetTillDate()) | ||||
| 			lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].SetUpdateDate(&now) | ||||
| 		} else if lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].GetValue() != measuredValue.GetValue() { | ||||
| 			compressedMeasuredValues = append(compressedMeasuredValues, lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()]) | ||||
| 			delete(lastMeasuredValuesBySensors[measuredValue.GetSensorID()], measuredValue.GetMeasuredValueType()) | ||||
| 			lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()] = measuredValue | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| // 	return compressedTemperatures | ||||
| // } | ||||
| 	// Copy all remaining entries from the map into the cache array | ||||
| 	for _, lastMeasuredValuesBySensor := range lastMeasuredValuesBySensors { | ||||
| 		for _, measuredValueType := range types.MeasuredValueTypes { | ||||
| 			if measuredValue, ok := lastMeasuredValuesBySensor[measuredValueType]; ok { | ||||
| 				compressedMeasuredValues = append(compressedMeasuredValues, measuredValue) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Sort all measured values again to include the measured values from the | ||||
| 	// cache. | ||||
| 	sort.SliceStable(compressedMeasuredValues, func(i int, j int) bool { | ||||
| 		return compressedMeasuredValues[i].GetFromDate().Before(compressedMeasuredValues[j].GetFromDate()) | ||||
| 	}) | ||||
|  | ||||
| 	return compressedMeasuredValues | ||||
| } | ||||
|  | ||||
| // New returns a log file with basic functions for reading and writing data. The | ||||
| // file extension of the logfile is taken into account to format the logfile | ||||
|   | ||||
| @@ -13,20 +13,32 @@ type Humidity struct { | ||||
| 	UpdateDate       *time.Time `json:"update_date" xml:"update_date"` | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetCreationDate() *time.Time { | ||||
| 	return h.CreationDate | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetID() string { | ||||
| 	return h.HumidityID | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetValue() float64 { | ||||
| 	return h.HumidityValue | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetFromDate() time.Time { | ||||
| 	return h.HumidityFromDate | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetTillDate() time.Time { | ||||
| 	return h.HumidityTillDate | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetSensorID() string { | ||||
| 	return h.SensorID | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetValue() float64 { | ||||
| 	return h.HumidityValue | ||||
| func (h *Humidity) GetCreationDate() *time.Time { | ||||
| 	return h.CreationDate | ||||
| } | ||||
|  | ||||
| func (h *Humidity) GetMeasuredValueType() MeasuredValueType { | ||||
| 	return MeasuredValueTypeHumidity | ||||
| } | ||||
|  | ||||
| func (h *Humidity) SetTillDate(date time.Time) { | ||||
|   | ||||
| @@ -5,9 +5,24 @@ import "time" | ||||
| type MeasuredValue interface { | ||||
| 	GetID() string | ||||
| 	GetCreationDate() *time.Time | ||||
| 	GetMeasuredValueType() MeasuredValueType | ||||
| 	GetFromDate() time.Time | ||||
| 	GetTillDate() time.Time | ||||
| 	GetSensorID() string | ||||
| 	GetValue() float64 | ||||
| 	SetCreationDate(date *time.Time) | ||||
| 	SetTillDate(date time.Time) | ||||
| 	SetUpdateDate(date *time.Time) | ||||
| } | ||||
|  | ||||
| type MeasuredValueType string | ||||
|  | ||||
| const ( | ||||
| 	MeasuredValueTypeHumidity    MeasuredValueType = "humidity" | ||||
| 	MeasuredValueTypeTemperature MeasuredValueType = "temperature" | ||||
| ) | ||||
|  | ||||
| var MeasuredValueTypes = []MeasuredValueType{ | ||||
| 	MeasuredValueTypeHumidity, | ||||
| 	MeasuredValueTypeTemperature, | ||||
| } | ||||
|   | ||||
| @@ -13,20 +13,32 @@ type Temperature struct { | ||||
| 	UpdateDate          *time.Time `json:"update_date" xml:"update_date"` | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetCreationDate() *time.Time { | ||||
| 	return t.CreationDate | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetID() string { | ||||
| 	return t.TemperatureID | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetValue() float64 { | ||||
| 	return t.TemperatureValue | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetFromDate() time.Time { | ||||
| 	return t.TemperatureFromDate | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetTillDate() time.Time { | ||||
| 	return t.TemperatureTillDate | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetSensorID() string { | ||||
| 	return t.SensorID | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetValue() float64 { | ||||
| 	return t.TemperatureValue | ||||
| func (t *Temperature) GetCreationDate() *time.Time { | ||||
| 	return t.CreationDate | ||||
| } | ||||
|  | ||||
| func (t *Temperature) GetMeasuredValueType() MeasuredValueType { | ||||
| 	return MeasuredValueTypeTemperature | ||||
| } | ||||
|  | ||||
| func (t *Temperature) SetTillDate(date time.Time) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user