func (f *FlowTraversalStep) Count(s ...interface{}) *traversal.GraphTraversalValue { if f.Error() != nil { return traversal.NewGraphTraversalValue(f.GraphTraversal, 0, f.Error()) } return traversal.NewGraphTraversalValue(f.GraphTraversal, len(f.flowset.Flows)) }
func (f *FlowTraversalStep) PropertyKeys(keys ...interface{}) *traversal.GraphTraversalValue { if f.error != nil { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, f.error) } var s []interface{} if len(f.flowset.Flows) > 0 { // all Flow structs are the same, take the first one s = f.flowset.Flows[0].GetFields() } return traversal.NewGraphTraversalValue(f.GraphTraversal, s, nil) }
func (f *FlowTraversalStep) propertyStringValues(field string) *traversal.GraphTraversalValue { var s []interface{} for _, fl := range f.flowset.Flows { v, err := fl.GetFieldString(field) if err != nil { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, err) } if v != "" { s = append(s, v) } } return traversal.NewGraphTraversalValue(f.GraphTraversal, s, nil) }
func (f *FlowTraversalStep) PropertyValues(keys ...interface{}) *traversal.GraphTraversalValue { if f.error != nil { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, f.error) } key := keys[0].(string) if len(f.flowset.Flows) > 0 { // use the first flow to determine what is the type of the field if _, err := f.flowset.Flows[0].GetFieldInt64(key); err == nil { return f.propertyInt64Values(key) } return f.propertyStringValues(key) } return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, flow.ErrFieldNotFound) }
func (f *FlowTraversalStep) propertyInt64Values(field string) *traversal.GraphTraversalValue { var s []interface{} for _, fl := range f.flowset.Flows { if v, err := fl.GetFieldInt64(field); err == nil { s = append(s, v) } } return traversal.NewGraphTraversalValue(f.GraphTraversal, s, nil) }
// Sum aggregates integer values mapped by 'key' cross flows func (f *FlowTraversalStep) Sum(keys ...interface{}) *traversal.GraphTraversalValue { if f.error != nil { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, f.error) } if len(keys) != 1 { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, fmt.Errorf("Sum requires 1 parameter")) } key, ok := keys[0].(string) if !ok { return traversal.NewGraphTraversalValue(f.GraphTraversal, nil, fmt.Errorf("Sum parameter has to be a string key")) } var s float64 for _, fl := range f.flowset.Flows { if v, err := fl.GetFieldInt64(key); err == nil { s += float64(v) } else { return traversal.NewGraphTraversalValue(f.GraphTraversal, s, err) } } return traversal.NewGraphTraversalValue(f.GraphTraversal, s, nil) }
// Sum aggregates integer values mapped by 'key' cross flows func (m *MetricsTraversalStep) Sum(keys ...interface{}) *traversal.GraphTraversalValue { if m.error != nil { return traversal.NewGraphTraversalValue(m.GraphTraversal, nil, m.error) } if len(keys) > 0 { if len(keys) != 1 { return traversal.NewGraphTraversalValue(m.GraphTraversal, nil, fmt.Errorf("Sum requires 1 parameter")) } key, ok := keys[0].(string) if !ok { return traversal.NewGraphTraversalValue(m.GraphTraversal, nil, errors.New("Argument of Sum must be a string")) } var total int64 for _, metrics := range m.metrics { for _, metric := range metrics { value, err := metric.GetField(key) if err != nil { traversal.NewGraphTraversalValue(m.GraphTraversal, nil, err) } total += value } } return traversal.NewGraphTraversalValue(m.GraphTraversal, total) } var total flow.FlowMetric for _, metrics := range m.metrics { for _, metric := range metrics { total.ABBytes += metric.ABBytes total.BABytes += metric.BABytes total.ABPackets += metric.ABPackets total.BAPackets += metric.BAPackets if total.Start == 0 || total.Start > metric.Start { total.Start = metric.Start } if total.Last == 0 || total.Last < metric.Last { total.Last = metric.Last } } } return traversal.NewGraphTraversalValue(m.GraphTraversal, &total) }
func (f *MetricsTraversalStep) Count(s ...interface{}) *traversal.GraphTraversalValue { return traversal.NewGraphTraversalValue(f.GraphTraversal, len(f.metrics)) }