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...)
 | 
						allMeasuredValues = append(allMeasuredValues, measuredValues...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if compression {
 | 
				
			||||||
 | 
							allMeasuredValues = Compression(allMeasuredValues)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = jl.Write(allMeasuredValues)
 | 
						err = jl.Write(allMeasuredValues)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@@ -56,6 +60,11 @@ func (jl *jsonLogfile) Read() ([]types.MeasuredValue, error) {
 | 
				
			|||||||
	measuredValues := make([]types.MeasuredValue, 0)
 | 
						measuredValues := make([]types.MeasuredValue, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, unmarshaledMeasuredValue := range unmarshaledMeasuredValues {
 | 
						for _, unmarshaledMeasuredValue := range unmarshaledMeasuredValues {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if unmarshaledMeasuredValue == nil {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mappedMeasuredValue, ok := unmarshaledMeasuredValue.(map[string]interface{})
 | 
							mappedMeasuredValue, ok := unmarshaledMeasuredValue.(map[string]interface{})
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			log.Println("Can not parse into map")
 | 
								log.Println("Can not parse into map")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ package logfile
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-flucky/flucky/pkg/types"
 | 
						"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 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
 | 
					var timeFormat = time.RFC3339
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CompressTemperature compresses the temperatures from an array. It is checked
 | 
					// Compression the measured values. The system checks whether the measured values
 | 
				
			||||||
// whether the measured temperature of a value corresponds to that of the
 | 
					// of the same type correspond to those of the predecessor. If this is the case,
 | 
				
			||||||
// predecessor. If this is the case, the current value is discarded and the
 | 
					// the current value is discarded and the validity date of the previous value is
 | 
				
			||||||
// validity date of the predecessor value is set to that of the current value.
 | 
					// set to that of the current value. This means that no information is lost.
 | 
				
			||||||
// No information is lost as a result. The validity period of the measured value
 | 
					// Only the validity period of the measured value is increased.
 | 
				
			||||||
// is thereby exclusively increased.
 | 
					func Compression(measuredValues []types.MeasuredValue) []types.MeasuredValue {
 | 
				
			||||||
// func Compression(measuredValues []types) []*types.Temperature {
 | 
						compressedMeasuredValues := make([]types.MeasuredValue, 0)
 | 
				
			||||||
// 	compressedTemperatures := make([]*types.Temperature, 0)
 | 
						lastMeasuredValuesBySensors := make(map[string]map[types.MeasuredValueType]types.MeasuredValue, 0)
 | 
				
			||||||
// 	lastTemperatureBySensors := make(map[string]*types.Temperature, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 	// Sort all measured temperatures beforehand by the starting validity date to
 | 
						// Sort all measured values according to the start time of the validity date
 | 
				
			||||||
// 	// avoid errors when compressing the temperatures.
 | 
						// in order to successfully implement the subsequent compression.
 | 
				
			||||||
// 	SortTemperatures(temperatures)
 | 
						sort.SliceStable(measuredValues, func(i int, j int) bool {
 | 
				
			||||||
 | 
							return measuredValues[i].GetFromDate().Before(measuredValues[j].GetFromDate())
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 	for _, temperature := range temperatures {
 | 
						now := time.Now()
 | 
				
			||||||
// 		if lastTemperatureBySensor, ok := lastTemperatureBySensors[temperature.SensorID]; ok {
 | 
					 | 
				
			||||||
// 			if lastTemperatureBySensor.TemperatureValue == temperature.TemperatureValue {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 				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()
 | 
							if _, ok := lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()]; !ok {
 | 
				
			||||||
// 				lastTemperatureBySensors[temperature.SensorID].UpdateDate = &now
 | 
								lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()] = measuredValue
 | 
				
			||||||
// 			} else {
 | 
								continue
 | 
				
			||||||
// 				compressedTemperatures = append(compressedTemperatures, lastTemperatureBySensors[temperature.SensorID])
 | 
							}
 | 
				
			||||||
// 				lastTemperatureBySensors[temperature.SensorID] = temperature
 | 
					 | 
				
			||||||
// 			}
 | 
					 | 
				
			||||||
// 		} else {
 | 
					 | 
				
			||||||
// 			lastTemperatureBySensors[temperature.SensorID] = temperature
 | 
					 | 
				
			||||||
// 		}
 | 
					 | 
				
			||||||
// 	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 	// Copy all remaining entries from the map into the array
 | 
							if lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].GetValue() == measuredValue.GetValue() {
 | 
				
			||||||
// 	for _, lastTemperatureBySensor := range lastTemperatureBySensors {
 | 
								lastMeasuredValuesBySensors[measuredValue.GetSensorID()][measuredValue.GetMeasuredValueType()].SetTillDate(measuredValue.GetTillDate())
 | 
				
			||||||
// 		compressedTemperatures = append(compressedTemperatures, lastTemperatureBySensor)
 | 
								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
 | 
					// 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
 | 
					// 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"`
 | 
						UpdateDate       *time.Time `json:"update_date" xml:"update_date"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Humidity) GetCreationDate() *time.Time {
 | 
					 | 
				
			||||||
	return h.CreationDate
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (h *Humidity) GetID() string {
 | 
					func (h *Humidity) GetID() string {
 | 
				
			||||||
	return h.HumidityID
 | 
						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 {
 | 
					func (h *Humidity) GetSensorID() string {
 | 
				
			||||||
	return h.SensorID
 | 
						return h.SensorID
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Humidity) GetValue() float64 {
 | 
					func (h *Humidity) GetCreationDate() *time.Time {
 | 
				
			||||||
	return h.HumidityValue
 | 
						return h.CreationDate
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (h *Humidity) GetMeasuredValueType() MeasuredValueType {
 | 
				
			||||||
 | 
						return MeasuredValueTypeHumidity
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Humidity) SetTillDate(date time.Time) {
 | 
					func (h *Humidity) SetTillDate(date time.Time) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,24 @@ import "time"
 | 
				
			|||||||
type MeasuredValue interface {
 | 
					type MeasuredValue interface {
 | 
				
			||||||
	GetID() string
 | 
						GetID() string
 | 
				
			||||||
	GetCreationDate() *time.Time
 | 
						GetCreationDate() *time.Time
 | 
				
			||||||
 | 
						GetMeasuredValueType() MeasuredValueType
 | 
				
			||||||
 | 
						GetFromDate() time.Time
 | 
				
			||||||
 | 
						GetTillDate() time.Time
 | 
				
			||||||
	GetSensorID() string
 | 
						GetSensorID() string
 | 
				
			||||||
	GetValue() float64
 | 
						GetValue() float64
 | 
				
			||||||
	SetCreationDate(date *time.Time)
 | 
						SetCreationDate(date *time.Time)
 | 
				
			||||||
	SetTillDate(date time.Time)
 | 
						SetTillDate(date time.Time)
 | 
				
			||||||
	SetUpdateDate(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"`
 | 
						UpdateDate          *time.Time `json:"update_date" xml:"update_date"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (t *Temperature) GetCreationDate() *time.Time {
 | 
					 | 
				
			||||||
	return t.CreationDate
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (t *Temperature) GetID() string {
 | 
					func (t *Temperature) GetID() string {
 | 
				
			||||||
	return t.TemperatureID
 | 
						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 {
 | 
					func (t *Temperature) GetSensorID() string {
 | 
				
			||||||
	return t.SensorID
 | 
						return t.SensorID
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (t *Temperature) GetValue() float64 {
 | 
					func (t *Temperature) GetCreationDate() *time.Time {
 | 
				
			||||||
	return t.TemperatureValue
 | 
						return t.CreationDate
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (t *Temperature) GetMeasuredValueType() MeasuredValueType {
 | 
				
			||||||
 | 
						return MeasuredValueTypeTemperature
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (t *Temperature) SetTillDate(date time.Time) {
 | 
					func (t *Temperature) SetTillDate(date time.Time) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user