diff --git a/examples/load_csv/main.go b/examples/load_csv/main.go index cd8e348..ff0aa07 100644 --- a/examples/load_csv/main.go +++ b/examples/load_csv/main.go @@ -15,6 +15,7 @@ package main import ( + "fmt" "log" "os" "path/filepath" @@ -70,7 +71,7 @@ func run(opts *Options) error { if err != nil { return err } - rsp.Show() + fmt.Println(rsp) return nil } diff --git a/examples/load_json/main.go b/examples/load_json/main.go index 836f8fe..d56df14 100644 --- a/examples/load_json/main.go +++ b/examples/load_json/main.go @@ -15,6 +15,7 @@ package main import ( + "fmt" "log" "os" "path/filepath" @@ -54,7 +55,7 @@ func run(opts *Options) error { if err != nil { return err } - rsp.Show() + fmt.Println(rsp) return nil } diff --git a/rai/client.go b/rai/client.go index fc3c179..76fb8bf 100644 --- a/rai/client.go +++ b/rai/client.go @@ -1474,19 +1474,19 @@ func genLoadCSV(relation string, opts *CSVOptions) string { func (c *Client) LoadCSV( database, engine, relation string, r io.Reader, opts *CSVOptions, -) (*TransactionResult, error) { +) (*TransactionAsyncResult, error) { data, err := ioutil.ReadAll(r) if err != nil { return nil, err } source := genLoadCSV(relation, opts) inputs := map[string]string{"data": string(data)} - return c.ExecuteV1(database, engine, source, inputs, false) + return c.Execute(database, engine, source, inputs, false) } func (c *Client) LoadJSON( database, engine, relation string, r io.Reader, -) (*TransactionResult, error) { +) (*TransactionAsyncResult, error) { data, err := ioutil.ReadAll(r) if err != nil { return nil, err @@ -1495,7 +1495,7 @@ func (c *Client) LoadJSON( b.WriteString("def config:data = data\n") b.WriteString(fmt.Sprintf("def insert:%s = load_json[config]", relation)) inputs := map[string]string{"data": string(data)} - return c.ExecuteV1(database, engine, b.String(), inputs, false) + return c.Execute(database, engine, b.String(), inputs, false) } // diff --git a/rai/client_test.go b/rai/client_test.go index c273b22..a43e5e3 100644 --- a/rai/client_test.go +++ b/rai/client_test.go @@ -355,20 +355,6 @@ func TestExecuteAsync(t *testing.T) { assert.Equal(t, io.String(), expectedOutput) } -func findRelation(relations []Relation, colName string) *Relation { - for _, relation := range relations { - keys := relation.RelKey.Keys - if len(keys) == 0 { - continue - } - name := keys[0] - if name == colName { - return &relation - } - } - return nil -} - const sampleCSV = "" + "cocktail,quantity,price,date\n" + "\"martini\",2,12.50,\"2020-01-01\"\n" + @@ -387,46 +373,16 @@ func TestLoadCSV(t *testing.T) { r := strings.NewReader(sampleCSV) rsp, err := client.LoadCSV(databaseName, engineName, "sample_csv", r, nil) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 0, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rsp, err = client.ExecuteV1(databaseName, engineName, "def output = sample_csv", nil, true) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 4, len(rsp.Output)) + rsp, err = client.Execute(databaseName, engineName, "def output = sample_csv", nil, true) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - - rel := findRelation(rsp.Output, ":date") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":price") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"12.50", "14.25", "11.00", "12.25"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":quantity") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"2", "4", "4", "3"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":cocktail") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"martini", "sazerac", "cosmopolitan", "bellini"}, - }, rel.Columns) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"martini", "sazerac", "cosmopolitan", "bellini"}}, rsp.Results[0].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}}, rsp.Results[1].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"12.50", "14.25", "11.00", "12.25"}}, rsp.Results[2].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"2", "4", "4", "3"}}, rsp.Results[3].Table) } // Test loading CSV data with no header. @@ -447,46 +403,16 @@ func TestLoadCSVNoHeader(t *testing.T) { opts := NewCSVOptions().WithHeaderRow(0) rsp, err := client.LoadCSV(databaseName, engineName, "sample_no_header", r, opts) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 0, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rsp, err = client.ExecuteV1(databaseName, engineName, "def output = sample_no_header", nil, true) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 4, len(rsp.Output)) + rsp, err = client.Execute(databaseName, engineName, "def output = sample_no_header", nil, true) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - - rel := findRelation(rsp.Output, ":COL1") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {1., 2., 3., 4.}, - {"martini", "sazerac", "cosmopolitan", "bellini"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":COL2") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {1., 2., 3., 4.}, - {"2", "4", "4", "3"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":COL3") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {1., 2., 3., 4.}, - {"12.50", "14.25", "11.00", "12.25"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":COL4") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {1., 2., 3., 4.}, - {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}, - }, rel.Columns) + assert.Equal(t, [][]interface{}{{1., 2., 3., 4.}, {"martini", "sazerac", "cosmopolitan", "bellini"}}, rsp.Results[0].Table) + assert.Equal(t, [][]interface{}{{1., 2., 3., 4.}, {"2", "4", "4", "3"}}, rsp.Results[1].Table) + assert.Equal(t, [][]interface{}{{1., 2., 3., 4.}, {"12.50", "14.25", "11.00", "12.25"}}, rsp.Results[2].Table) + assert.Equal(t, [][]interface{}{{1., 2., 3., 4.}, {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}}, rsp.Results[3].Table) } // Test loading CSV data with alternate syntax options. @@ -508,47 +434,17 @@ func TestLoadCSVAltSyntax(t *testing.T) { opts := NewCSVOptions().WithDelim('|').WithQuoteChar('\'') rsp, err := client.LoadCSV(databaseName, engineName, "sample_alt_syntax", r, opts) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 0, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rsp, err = client.ExecuteV1( + rsp, err = client.Execute( databaseName, engineName, "def output = sample_alt_syntax", nil, true) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 4, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - - rel := findRelation(rsp.Output, ":date") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":price") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"12.50", "14.25", "11.00", "12.25"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":quantity") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"2", "4", "4", "3"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":cocktail") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"martini", "sazerac", "cosmopolitan", "bellini"}, - }, rel.Columns) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"martini", "sazerac", "cosmopolitan", "bellini"}}, rsp.Results[0].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}}, rsp.Results[1].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"12.50", "14.25", "11.00", "12.25"}}, rsp.Results[2].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"2", "4", "4", "3"}}, rsp.Results[3].Table) } // Test loading CSV data with a schema definition. @@ -568,46 +464,16 @@ func TestLoadCSVWithSchema(t *testing.T) { opts := NewCSVOptions().WithSchema(schema) rsp, err := client.LoadCSV(databaseName, engineName, "sample_with_schema", r, opts) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 0, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rsp, err = client.ExecuteV1(databaseName, engineName, "def output = sample_with_schema", nil, true) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 4, len(rsp.Output)) + rsp, err = client.Execute(databaseName, engineName, "def output = sample_with_schema", nil, true) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - - rel := findRelation(rsp.Output, ":date") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":price") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {12.50, 14.25, 11.00, 12.25}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":quantity") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {2., 4., 4., 3.}, - }, rel.Columns) - - rel = findRelation(rsp.Output, ":cocktail") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{ - {2., 3., 4., 5.}, - {"martini", "sazerac", "cosmopolitan", "bellini"}, - }, rel.Columns) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {"martini", "sazerac", "cosmopolitan", "bellini"}}, rsp.Results[0].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {737425., 737457., 737487., 737519.}}, rsp.Results[1].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {1250., 1425., 1100., 1225.}}, rsp.Results[2].Table) + assert.Equal(t, [][]interface{}{{2., 3., 4., 5.}, {2., 4., 4., 3.}}, rsp.Results[3].Table) } // Test loading JSON data. @@ -627,36 +493,19 @@ func TestLoadJSON(t *testing.T) { r := strings.NewReader(sampleJSON) rsp, err := client.LoadJSON(databaseName, engineName, "sample_json", r) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 0, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rsp, err = client.ExecuteV1( + rsp, err = client.Execute( databaseName, engineName, "def output = sample_json", nil, true) assert.Nil(t, err) - assert.Equal(t, false, rsp.Aborted) - assert.Equal(t, 4, len(rsp.Output)) + assert.Equal(t, "COMPLETED", rsp.Transaction.State) assert.Equal(t, 0, len(rsp.Problems)) - rel := findRelation(rsp.Output, ":name") - assert.NotNil(t, rel) - assert.Equal(t, 1, len(rel.Columns)) - assert.Equal(t, [][]interface{}{{"Amira"}}, rel.Columns) - - rel = findRelation(rsp.Output, ":age") - assert.NotNil(t, rel) - assert.Equal(t, 1, len(rel.Columns)) - assert.Equal(t, [][]interface{}{{32.}}, rel.Columns) - - rel = findRelation(rsp.Output, ":height") - assert.NotNil(t, rel) - assert.Equal(t, 1, len(rel.Columns)) - assert.Equal(t, [][]interface{}{{nil}}, rel.Columns) - - rel = findRelation(rsp.Output, ":pets") - assert.NotNil(t, rel) - assert.Equal(t, 2, len(rel.Columns)) - assert.Equal(t, [][]interface{}{{1., 2.}, {"dog", "rabbit"}}, rel.Columns) + assert.Equal(t, [][]interface{}{{32.}}, rsp.Results[0].Table) + assert.Equal(t, [][]interface{}{{make(map[string]interface{})}}, rsp.Results[1].Table) + assert.Equal(t, [][]interface{}{{"Amira"}}, rsp.Results[2].Table) + assert.Equal(t, [][]interface{}{{1., 2.}, {"dog", "rabbit"}}, rsp.Results[3].Table) } // Test model APIs.