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