// CreateIterator creates a remote streaming iterator. func (ic *remoteIteratorCreator) CreateIterator(opt influxql.IteratorOptions) (influxql.Iterator, error) { conn, err := ic.dialer.DialNode(ic.nodeID) if err != nil { return nil, err } if err := func() error { // Write request. if err := EncodeTLV(conn, createIteratorRequestMessage, &CreateIteratorRequest{ ShardIDs: ic.shardIDs, Opt: opt, }); err != nil { return err } // Read the response. var resp CreateIteratorResponse if _, err := DecodeTLV(conn, &resp); err != nil { return err } else if resp.Err != nil { return err } return nil }(); err != nil { conn.Close() return nil, err } return influxql.NewReaderIterator(conn) }
// Ensure iterator can be encoded and decoded over a byte stream. func TestIterator_EncodeDecode(t *testing.T) { var buf bytes.Buffer // Create an iterator with several points & stats. itr := &FloatIterator{ Points: []influxql.FloatPoint{ {Name: "cpu", Tags: ParseTags("host=A"), Time: 0, Value: 0}, {Name: "mem", Tags: ParseTags("host=B"), Time: 1, Value: 10}, }, stats: influxql.IteratorStats{ SeriesN: 2, PointN: 0, }, } // Encode to the buffer. enc := influxql.NewIteratorEncoder(&buf) enc.StatsInterval = 100 * time.Millisecond if err := enc.EncodeIterator(itr); err != nil { t.Fatal(err) } // Decode from the buffer. dec, err := influxql.NewReaderIterator(&buf, influxql.Float, itr.Stats()) if err != nil { t.Fatal(err) } // Initial stats should exist immediately. fdec := dec.(influxql.FloatIterator) if stats := fdec.Stats(); !reflect.DeepEqual(stats, influxql.IteratorStats{SeriesN: 2, PointN: 0}) { t.Fatalf("unexpected stats(initial): %#v", stats) } // Read both points. if p, err := fdec.Next(); err != nil { t.Fatalf("unexpected error(0): %#v", err) } else if !reflect.DeepEqual(p, &influxql.FloatPoint{Name: "cpu", Tags: ParseTags("host=A"), Time: 0, Value: 0}) { t.Fatalf("unexpected point(0); %#v", p) } if p, err := fdec.Next(); err != nil { t.Fatalf("unexpected error(1): %#v", err) } else if !reflect.DeepEqual(p, &influxql.FloatPoint{Name: "mem", Tags: ParseTags("host=B"), Time: 1, Value: 10}) { t.Fatalf("unexpected point(1); %#v", p) } if p, err := fdec.Next(); err != nil { t.Fatalf("unexpected error(eof): %#v", err) } else if p != nil { t.Fatalf("unexpected point(eof); %#v", p) } }