func (self *CoordinatorImpl) InterpolateValuesAndCommit(query string, db string, series *protocol.Series, targetName string, assignSequenceNumbers bool) error { defer common.RecoverFunc(db, query, nil) targetName = strings.Replace(targetName, ":series_name", *series.Name, -1) type sequenceKey struct { seriesName string timestamp int64 } sequenceMap := make(map[sequenceKey]int) r, _ := regexp.Compile(`\[.*?\]`) if r.MatchString(targetName) { serieses := map[string]*protocol.Series{} for _, point := range series.Points { targetNameWithValues := r.ReplaceAllStringFunc(targetName, func(match string) string { fieldName := match[1 : len(match)-1] fieldIndex := series.GetFieldIndex(fieldName) return point.GetFieldValueAsString(fieldIndex) }) if assignSequenceNumbers { key := sequenceKey{targetNameWithValues, *point.Timestamp} sequenceMap[key] += 1 sequenceNumber := uint64(sequenceMap[key]) point.SequenceNumber = &sequenceNumber } newSeries := serieses[targetNameWithValues] if newSeries == nil { newSeries = &protocol.Series{Name: &targetNameWithValues, Fields: series.Fields, Points: []*protocol.Point{point}} serieses[targetNameWithValues] = newSeries continue } newSeries.Points = append(newSeries.Points, point) } seriesSlice := make([]*protocol.Series, 0, len(serieses)) for _, s := range serieses { seriesSlice = append(seriesSlice, s) } if e := self.CommitSeriesData(db, seriesSlice, true); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } else { newSeries := &protocol.Series{Name: &targetName, Fields: series.Fields, Points: series.Points} if assignSequenceNumbers { for _, point := range newSeries.Points { sequenceMap[sequenceKey{targetName, *point.Timestamp}] += 1 sequenceNumber := uint64(sequenceMap[sequenceKey{targetName, *point.Timestamp}]) point.SequenceNumber = &sequenceNumber } } if e := self.CommitSeriesData(db, []*protocol.Series{newSeries}, true); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } return nil }
func (self *CoordinatorImpl) InterpolateValuesAndCommit(db string, series *protocol.Series, targetName string, assignSequenceNumbers bool) error { targetName = strings.Replace(targetName, ":series_name", *series.Name, -1) type sequenceKey struct { seriesName string timestamp int64 } sequenceMap := make(map[sequenceKey]int) r, _ := regexp.Compile(`\[.*\]`) replaceInvalidCharacters := func(r rune) rune { switch { case (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9'): return r case r == '_' || r == '-' || r == '.': return r case r == ' ': return '_' case r == '/': return '.' } return -1 } if r.MatchString(targetName) { for _, point := range series.Points { targetNameWithValues := r.ReplaceAllStringFunc(targetName, func(match string) string { fieldName := match[1 : len(match)-1] fieldIndex := series.GetFieldIndex(fieldName) return point.GetFieldValueAsString(fieldIndex) }) cleanedTargetName := strings.Map(replaceInvalidCharacters, targetNameWithValues) if assignSequenceNumbers { sequenceMap[sequenceKey{targetName, *point.Timestamp}] += 1 sequenceNumber := uint64(sequenceMap[sequenceKey{targetName, *point.Timestamp}]) point.SequenceNumber = &sequenceNumber } newSeries := &protocol.Series{Name: &cleanedTargetName, Fields: series.Fields, Points: []*protocol.Point{point}} if e := self.CommitSeriesData(db, newSeries); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } } else { newSeries := &protocol.Series{Name: &targetName, Fields: series.Fields, Points: series.Points} if assignSequenceNumbers { for _, point := range newSeries.Points { sequenceMap[sequenceKey{targetName, *point.Timestamp}] += 1 sequenceNumber := uint64(sequenceMap[sequenceKey{targetName, *point.Timestamp}]) point.SequenceNumber = &sequenceNumber } } if e := self.CommitSeriesData(db, newSeries); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } return nil }
func (self *CoordinatorImpl) InterpolateValuesAndCommit(query string, db string, series *protocol.Series, targetName string, assignSequenceNumbers bool) error { defer common.RecoverFunc(db, query, nil) targetName = strings.Replace(targetName, ":series_name", *series.Name, -1) type sequenceKey struct { seriesName string timestamp int64 } sequenceMap := make(map[sequenceKey]int) r, _ := regexp.Compile(`\[.*?\]`) // get the fields that are used in the target name fieldsInTargetName := r.FindAllString(targetName, -1) fieldsIndeces := make([]int, 0, len(fieldsInTargetName)) for i, f := range fieldsInTargetName { f = f[1 : len(f)-1] fieldsIndeces = append(fieldsIndeces, series.GetFieldIndex(f)) fieldsInTargetName[i] = f } fields := make([]string, 0, len(series.Fields)-len(fieldsIndeces)) // remove the fields used in the target name from the series fields nextfield: for i, f := range series.Fields { for _, fi := range fieldsIndeces { if fi == i { continue nextfield } } fields = append(fields, f) } if r.MatchString(targetName) { serieses := map[string]*protocol.Series{} for _, point := range series.Points { fieldIndex := 0 targetNameWithValues := r.ReplaceAllStringFunc(targetName, func(_ string) string { value := point.GetFieldValueAsString(fieldsIndeces[fieldIndex]) fieldIndex++ return value }) p := &protocol.Point{ Values: make([]*protocol.FieldValue, 0, len(point.Values)-len(fieldsIndeces)), Timestamp: point.Timestamp, SequenceNumber: point.SequenceNumber, } // remove the fields used in the target name from the series fields nextvalue: for i, v := range point.Values { for _, fi := range fieldsIndeces { if fi == i { continue nextvalue } } p.Values = append(p.Values, v) } if assignSequenceNumbers { key := sequenceKey{targetNameWithValues, *p.Timestamp} sequenceMap[key] += 1 sequenceNumber := uint64(sequenceMap[key]) p.SequenceNumber = &sequenceNumber } newSeries := serieses[targetNameWithValues] if newSeries == nil { newSeries = &protocol.Series{Name: &targetNameWithValues, Fields: fields, Points: []*protocol.Point{p}} serieses[targetNameWithValues] = newSeries continue } newSeries.Points = append(newSeries.Points, p) } seriesSlice := make([]*protocol.Series, 0, len(serieses)) for _, s := range serieses { seriesSlice = append(seriesSlice, s) } if e := self.CommitSeriesData(db, seriesSlice, true); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } else { newSeries := &protocol.Series{Name: &targetName, Fields: fields, Points: series.Points} if assignSequenceNumbers { for _, point := range newSeries.Points { sequenceMap[sequenceKey{targetName, *point.Timestamp}] += 1 sequenceNumber := uint64(sequenceMap[sequenceKey{targetName, *point.Timestamp}]) point.SequenceNumber = &sequenceNumber } } if e := self.CommitSeriesData(db, []*protocol.Series{newSeries}, true); e != nil { log.Error("Couldn't write data for continuous query: ", e) } } return nil }