github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/select_csv_objcet_test.go (about)

     1  package oss
     2  
     3  import (
     4  	"io"
     5  	"io/ioutil"
     6  	"os"
     7  	"strconv"
     8  	"strings"
     9  
    10  	. "gopkg.in/check.v1"
    11  )
    12  
    13  type OssSelectCsvSuite struct {
    14  	cloudBoxControlClient *Client
    15  	client                *Client
    16  	bucket                *Bucket
    17  }
    18  
    19  var _ = Suite(&OssSelectCsvSuite{})
    20  
    21  func (s *OssSelectCsvSuite) SetUpSuite(c *C) {
    22  	bucketName := bucketNamePrefix + RandLowStr(6)
    23  	if cloudboxControlEndpoint == "" {
    24  		client, err := New(endpoint, accessID, accessKey)
    25  		c.Assert(err, IsNil)
    26  		s.client = client
    27  		s.client.Config.LogLevel = Error // Debug
    28  		// s.client.Config.Timeout = 5
    29  		err = s.client.CreateBucket(bucketName)
    30  		c.Assert(err, IsNil)
    31  		bucket, err := s.client.Bucket(bucketName)
    32  		c.Assert(err, IsNil)
    33  		s.bucket = bucket
    34  	} else {
    35  		client, err := New(cloudboxEndpoint, accessID, accessKey)
    36  		c.Assert(err, IsNil)
    37  		s.client = client
    38  
    39  		controlClient, err := New(cloudboxControlEndpoint, accessID, accessKey)
    40  		c.Assert(err, IsNil)
    41  		s.cloudBoxControlClient = controlClient
    42  		controlClient.CreateBucket(bucketName)
    43  
    44  		bucket, err := s.client.Bucket(bucketName)
    45  		c.Assert(err, IsNil)
    46  		s.bucket = bucket
    47  	}
    48  
    49  	testLogger.Println("test select csv started")
    50  }
    51  
    52  func (s *OssSelectCsvSuite) TearDownSuite(c *C) {
    53  	// Delete objects
    54  	marker := Marker("")
    55  	for {
    56  		lor, err := s.bucket.ListObjects(marker)
    57  		c.Assert(err, IsNil)
    58  		for _, object := range lor.Objects {
    59  			err = s.bucket.DeleteObject(object.Key)
    60  			c.Assert(err, IsNil)
    61  		}
    62  		marker = Marker(lor.NextMarker)
    63  		if !lor.IsTruncated {
    64  			break
    65  		}
    66  	}
    67  
    68  	// Delete bucket
    69  	if s.cloudBoxControlClient != nil {
    70  		err := s.cloudBoxControlClient.DeleteBucket(s.bucket.BucketName)
    71  		c.Assert(err, IsNil)
    72  	} else {
    73  		err := s.client.DeleteBucket(s.bucket.BucketName)
    74  		c.Assert(err, IsNil)
    75  	}
    76  
    77  	testLogger.Println("test select csv completed")
    78  }
    79  
    80  func (s *OssSelectCsvSuite) SetUpTest(c *C) {
    81  	testLogger.Println("test func", c.TestName(), "start")
    82  }
    83  
    84  func (s *OssSelectCsvSuite) TearDownTest(c *C) {
    85  	testLogger.Println("test func", c.TestName(), "succeed")
    86  }
    87  
    88  // TestCreateSelectObjectMeta
    89  func (s *OssSelectCsvSuite) TestCreateSelectCsvObjectMeta(c *C) {
    90  	key := "sample_data.csv"
    91  	localCsvFile := "../sample/sample_data.csv"
    92  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
    93  	c.Assert(err, IsNil)
    94  	csvMeta := CsvMetaRequest{}
    95  	var bo bool
    96  	csvMeta.OverwriteIfExists = &bo
    97  	res, err := s.bucket.CreateSelectCsvObjectMeta(key, csvMeta)
    98  	c.Assert(err, IsNil)
    99  	l, err := readCsvLine(localCsvFile)
   100  	c.Assert(err, IsNil)
   101  	c.Assert(res.RowsCount, Equals, int64(l))
   102  
   103  	bo = true
   104  	csvMeta.OverwriteIfExists = &bo
   105  	csvMeta.InputSerialization.CSV.RecordDelimiter = "\n"
   106  	csvMeta.InputSerialization.CSV.FieldDelimiter = ","
   107  	csvMeta.InputSerialization.CSV.QuoteCharacter = "\""
   108  	res, err = s.bucket.CreateSelectCsvObjectMeta(key, csvMeta)
   109  	c.Assert(err, IsNil)
   110  	c.Assert(res.RowsCount, Equals, int64(l))
   111  
   112  	err = s.bucket.DeleteObject(key)
   113  	c.Assert(err, IsNil)
   114  }
   115  
   116  func (s *OssSelectCsvSuite) TestSelectCsvObjectIsEmpty(c *C) {
   117  	key := "sample_data.csv"
   118  	localCsvFile := "../sample/sample_data.csv"
   119  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   120  	c.Assert(err, IsNil)
   121  	csvMeta := CsvMetaRequest{}
   122  	_, err = s.bucket.CreateSelectCsvObjectMeta(key, csvMeta)
   123  	c.Assert(err, IsNil)
   124  	selReq := SelectRequest{}
   125  	selReq.Expression = "select Year, StateAbbr, CityName, PopulationCount from ossobject where CityName != ''"
   126  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   127  
   128  	body, err := s.bucket.SelectObject(key, selReq)
   129  	c.Assert(err, IsNil)
   130  	defer body.Close()
   131  
   132  	p := make([]byte, 512)
   133  	n, err := body.Read(p)
   134  	c.Assert(err, IsNil)
   135  	c.Assert(n, Equals, 512)
   136  	p1 := make([]byte, 3)
   137  	_, err = body.Read(p1)
   138  	c.Assert(err, IsNil)
   139  	rets, err := ioutil.ReadAll(body)
   140  	c.Assert(err, IsNil)
   141  	str, err := readCsvIsEmpty(localCsvFile)
   142  	c.Assert(err, IsNil)
   143  	c.Assert(string(p)+string(p1)+string(rets), Equals, str)
   144  
   145  	err = s.bucket.DeleteObject(key)
   146  	c.Assert(err, IsNil)
   147  }
   148  
   149  func (s *OssSelectCsvSuite) TestSelectObjectIntoFile(c *C) {
   150  	var bo bool = true
   151  	key := "sample_data.csv"
   152  	localCsvFile := "../sample/sample_data.csv"
   153  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   154  	c.Assert(err, IsNil)
   155  	csvMeta := CsvMetaRequest{
   156  		InputSerialization: InputSerialization{
   157  			CSV: CSV{
   158  				RecordDelimiter: "\n",
   159  				FieldDelimiter:  ",",
   160  				QuoteCharacter:  "\"",
   161  			},
   162  		},
   163  		OverwriteIfExists: &bo,
   164  	}
   165  	res, err := s.bucket.CreateSelectCsvObjectMeta(key, csvMeta)
   166  	c.Assert(err, IsNil)
   167  	l, err := readCsvLine(localCsvFile)
   168  	c.Assert(err, IsNil)
   169  	c.Assert(res.RowsCount, Equals, int64(l))
   170  
   171  	selReq := SelectRequest{
   172  		Expression: "select * from ossobject",
   173  		InputSerializationSelect: InputSerializationSelect{
   174  			CsvBodyInput: CSVSelectInput{
   175  				FileHeaderInfo:   "None",
   176  				CommentCharacter: "#",
   177  				RecordDelimiter:  "\n",
   178  				FieldDelimiter:   ",",
   179  				QuoteCharacter:   "\"",
   180  				Range:            "",
   181  			},
   182  		},
   183  	}
   184  	outfile := "sample_data_out.csv"
   185  	err = s.bucket.SelectObjectIntoFile(key, outfile, selReq)
   186  	c.Assert(err, IsNil)
   187  
   188  	fd1, err := os.Open(outfile)
   189  	c.Assert(err, IsNil)
   190  	defer fd1.Close()
   191  	fd2, err := os.Open(localCsvFile)
   192  	c.Assert(err, IsNil)
   193  	defer fd2.Close()
   194  	str1, err := ioutil.ReadAll(fd1)
   195  	c.Assert(err, IsNil)
   196  	str2, err := ioutil.ReadAll(fd2)
   197  	c.Assert(err, IsNil)
   198  	c.Assert(string(str1), Equals, string(str2))
   199  
   200  	fd1.Close()
   201  	err = os.Remove(outfile)
   202  	c.Assert(err, IsNil)
   203  	err = s.bucket.DeleteObject(key)
   204  	c.Assert(err, IsNil)
   205  }
   206  
   207  func (s *OssSelectCsvSuite) TestSelectCsvObjectRange(c *C) {
   208  	key := "sample_data.csv"
   209  	localCsvFile := "../sample/sample_data.csv"
   210  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   211  	c.Assert(err, IsNil)
   212  	csvMeta := CsvMetaRequest{}
   213  	_, err = s.bucket.CreateSelectCsvObjectMeta(key, csvMeta)
   214  	c.Assert(err, IsNil)
   215  	selReq := SelectRequest{}
   216  	selReq.Expression = "select Year,StateAbbr, CityName, Short_Question_Text from ossobject"
   217  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   218  	selReq.InputSerializationSelect.CsvBodyInput.Range = "0-2"
   219  	body, err := s.bucket.SelectObject(key, selReq)
   220  	c.Assert(err, IsNil)
   221  	defer body.Close()
   222  	rets, err := ioutil.ReadAll(body)
   223  
   224  	str, err := readCsvRange(localCsvFile, 0, 2)
   225  	c.Assert(err, IsNil)
   226  	c.Assert(string(rets), Equals, str)
   227  
   228  	err = s.bucket.DeleteObject(key)
   229  	c.Assert(err, IsNil)
   230  }
   231  
   232  func (s *OssSelectCsvSuite) TestSelectCsvObjectLike(c *C) {
   233  	key := "sample_data.csv"
   234  	localCsvFile := "../sample/sample_data.csv"
   235  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   236  	c.Assert(err, IsNil)
   237  	selReq := SelectRequest{}
   238  	selReq.Expression = "select Year, StateAbbr, CityName, Short_Question_Text from ossobject where Measure like '%blood pressure%Years'"
   239  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   240  	ret, err := s.bucket.SelectObject(key, selReq)
   241  	c.Assert(err, IsNil)
   242  	defer ret.Close()
   243  	ts, err := ioutil.ReadAll(ret)
   244  	c.Assert(err, IsNil)
   245  	str, err := readCsvLike(localCsvFile)
   246  	c.Assert(err, IsNil)
   247  	c.Assert(string(ts), Equals, str)
   248  
   249  	err = s.bucket.DeleteObject(key)
   250  	c.Assert(err, IsNil)
   251  }
   252  
   253  func (s *OssSelectCsvSuite) TestSelectCsvObjectIntAggregation(c *C) {
   254  	key := "sample_data.csv"
   255  	localCsvFile := "../sample/sample_data.csv"
   256  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   257  	c.Assert(err, IsNil)
   258  	selReq := SelectRequest{}
   259  	selReq.Expression = `select avg(cast(year as int)), max(cast(year as int)), min(cast(year as int)) from ossobject where year = 2015`
   260  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   261  	ret, err := s.bucket.SelectObject(key, selReq)
   262  	c.Assert(err, IsNil)
   263  	defer ret.Close()
   264  	ts, err := ioutil.ReadAll(ret)
   265  	c.Assert(err, IsNil)
   266  
   267  	c.Assert(string(ts), Equals, "2015,2015,2015\n")
   268  
   269  	err = s.bucket.DeleteObject(key)
   270  	c.Assert(err, IsNil)
   271  }
   272  
   273  func (s *OssSelectCsvSuite) TestSelectCsvObjectFloatAggregation(c *C) {
   274  	key := "sample_data.csv"
   275  	localCsvFile := "../sample/sample_data.csv"
   276  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   277  	c.Assert(err, IsNil)
   278  	selReq := SelectRequest{}
   279  	selReq.Expression = `select avg(cast(data_value as double)), max(cast(data_value as double)), sum(cast(data_value as double)) from ossobject`
   280  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   281  	ret, err := s.bucket.SelectObject(key, selReq)
   282  	c.Assert(err, IsNil)
   283  	defer ret.Close()
   284  	ts, err := ioutil.ReadAll(ret)
   285  	strR := string(ts)
   286  	c.Assert(err, IsNil)
   287  
   288  	avg, max, sum, err := readCsvFloatAgg(localCsvFile)
   289  	c.Assert(err, IsNil)
   290  
   291  	s1 := strconv.FormatFloat(avg, 'f', 5, 32) + ","
   292  	s1 += strconv.FormatFloat(max, 'f', 5, 32) + ","
   293  	s1 += strconv.FormatFloat(sum, 'f', 5, 32) + ","
   294  	retS := ""
   295  	for _, v := range strings.Split(strR[:len(strR)-1], ",") {
   296  		vv, err := strconv.ParseFloat(v, 64)
   297  		c.Assert(err, IsNil)
   298  		retS += strconv.FormatFloat(vv, 'f', 5, 32) + ","
   299  	}
   300  	c.Assert(s1, Equals, retS)
   301  
   302  	err = s.bucket.DeleteObject(key)
   303  	c.Assert(err, IsNil)
   304  }
   305  
   306  func (s *OssSelectCsvSuite) TestSelectCsvObjectConcat(c *C) {
   307  	key := "sample_data.csv"
   308  	localCsvFile := "../sample/sample_data.csv"
   309  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   310  	c.Assert(err, IsNil)
   311  	selReq := SelectRequest{}
   312  	selReq.Expression = `select Year,StateAbbr, CityName, Short_Question_Text from ossobject where (data_value || data_value_unit) = '14.8%'`
   313  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   314  	ret, err := s.bucket.SelectObject(key, selReq)
   315  	c.Assert(err, IsNil)
   316  	defer ret.Close()
   317  	ts, err := ioutil.ReadAll(ret)
   318  	c.Assert(err, IsNil)
   319  
   320  	str, err := readCsvConcat(localCsvFile)
   321  	c.Assert(err, IsNil)
   322  	c.Assert(string(ts), Equals, str)
   323  
   324  	err = s.bucket.DeleteObject(key)
   325  	c.Assert(err, IsNil)
   326  }
   327  
   328  func (s *OssSelectCsvSuite) TestSelectCsvObjectComplicateConcat(c *C) {
   329  	key := "sample_data.csv"
   330  	localCsvFile := "../sample/sample_data.csv"
   331  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   332  	c.Assert(err, IsNil)
   333  	selReq := SelectRequest{}
   334  	selReq.Expression = `
   335  	select 
   336  		Year,StateAbbr, CityName, Short_Question_Text, data_value, 
   337  		data_value_unit, category, high_confidence_limit 
   338  	from 
   339  		ossobject 
   340  	where 
   341  		data_value > 14.8 and 
   342  		data_value_unit = '%' or 
   343  		Measure like '%18 Years' and 
   344  		Category = 'Unhealthy Behaviors' or 
   345  		high_confidence_limit > 70.0 `
   346  
   347  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   348  	ret, err := s.bucket.SelectObject(key, selReq)
   349  	c.Assert(err, IsNil)
   350  	defer ret.Close()
   351  	ts, err := ioutil.ReadAll(ret)
   352  	c.Assert(err, IsNil)
   353  
   354  	str, err := readCsvComplicateCondition(localCsvFile)
   355  	c.Assert(err, IsNil)
   356  	c.Assert(string(ts), Equals, str)
   357  
   358  	err = s.bucket.DeleteObject(key)
   359  	c.Assert(err, IsNil)
   360  }
   361  
   362  func (s *OssSelectCsvSuite) TestSelectCsvObjectInvalidSql(c *C) {
   363  	key := "sample_data.csv"
   364  	localCsvFile := "../sample/sample_data.csv"
   365  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   366  	c.Assert(err, IsNil)
   367  	selReq := SelectRequest{}
   368  	selReq.Expression = `select * from ossobject where avg(cast(year as int)) > 2016`
   369  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   370  	_, err = s.bucket.SelectObject(key, selReq)
   371  	c.Assert(err, NotNil)
   372  
   373  	selReq.Expression = ``
   374  	_, err = s.bucket.SelectObject(key, selReq)
   375  	c.Assert(err, NotNil)
   376  
   377  	selReq.Expression = `select year || CityName from ossobject`
   378  	_, err = s.bucket.SelectObject(key, selReq)
   379  	c.Assert(err, NotNil)
   380  
   381  	selReq.Expression = `select * from ossobject group by CityName`
   382  	_, err = s.bucket.SelectObject(key, selReq)
   383  	c.Assert(err, NotNil)
   384  
   385  	selReq.Expression = `select * from ossobject order by _1`
   386  	_, err = s.bucket.SelectObject(key, selReq)
   387  	c.Assert(err, NotNil)
   388  
   389  	selReq.Expression = `select * from ossobject oss join s3object s3 on oss.CityName = s3.CityName`
   390  	_, err = s.bucket.SelectObject(key, selReq)
   391  	c.Assert(err, NotNil)
   392  
   393  	selReq.Expression = `select _1 from ossobject`
   394  	ret, err := s.bucket.SelectObject(key, selReq)
   395  	c.Assert(err, IsNil)
   396  	defer ret.Close()
   397  	_, err = ioutil.ReadAll(ret)
   398  	c.Assert(err, IsNil)
   399  
   400  	err = s.bucket.DeleteObject(key)
   401  	c.Assert(err, IsNil)
   402  }
   403  
   404  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithOutputDelimiters(c *C) {
   405  	key := "sample_data.csv"
   406  	content := "abc,def\n"
   407  	err := s.bucket.PutObject(key, strings.NewReader(content))
   408  	c.Assert(err, IsNil)
   409  	selReq := SelectRequest{}
   410  	selReq.Expression = `select _1, _2 from ossobject `
   411  	selReq.OutputSerializationSelect.CsvBodyOutput.RecordDelimiter = "\r\n"
   412  	selReq.OutputSerializationSelect.CsvBodyOutput.FieldDelimiter = "|"
   413  
   414  	ret, err := s.bucket.SelectObject(key, selReq)
   415  	c.Assert(err, IsNil)
   416  	defer ret.Close()
   417  	ts, err := ioutil.ReadAll(ret)
   418  	c.Assert(err, IsNil)
   419  	c.Assert(string(ts), Equals, "abc|def\r\n")
   420  
   421  	err = s.bucket.DeleteObject(key)
   422  	c.Assert(err, IsNil)
   423  }
   424  
   425  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithCrc(c *C) {
   426  	key := "sample_data.csv"
   427  	content := "abc,def\n"
   428  	err := s.bucket.PutObject(key, strings.NewReader(content))
   429  	c.Assert(err, IsNil)
   430  	selReq := SelectRequest{}
   431  	selReq.Expression = `select * from ossobject`
   432  	bo := true
   433  	selReq.OutputSerializationSelect.EnablePayloadCrc = &bo
   434  
   435  	ret, err := s.bucket.SelectObject(key, selReq)
   436  	c.Assert(err, IsNil)
   437  	defer ret.Close()
   438  	ts, err := ioutil.ReadAll(ret)
   439  	c.Assert(err, IsNil)
   440  	c.Assert(string(ts), Equals, content)
   441  
   442  	err = s.bucket.DeleteObject(key)
   443  	c.Assert(err, IsNil)
   444  }
   445  
   446  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithSkipPartialData(c *C) {
   447  	key := "sample_data.csv"
   448  	content := "abc,def\nefg\n"
   449  	err := s.bucket.PutObject(key, strings.NewReader(content))
   450  	c.Assert(err, IsNil)
   451  	selReq := SelectRequest{}
   452  	selReq.Expression = `select _1, _2 from ossobject`
   453  	bo := true
   454  	selReq.SelectOptions.SkipPartialDataRecord = &bo
   455  	ret, err := s.bucket.SelectObject(key, selReq)
   456  	c.Assert(err, IsNil)
   457  	defer ret.Close()
   458  	ts, err := ioutil.ReadAll(ret)
   459  	c.Assert(err, IsNil)
   460  	c.Assert(string(ts), Equals, "abc,def\n")
   461  
   462  	err = s.bucket.DeleteObject(key)
   463  	c.Assert(err, IsNil)
   464  }
   465  
   466  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithOutputRaw(c *C) {
   467  	key := "sample_data.csv"
   468  	content := "abc,def\n"
   469  	err := s.bucket.PutObject(key, strings.NewReader(content))
   470  	c.Assert(err, IsNil)
   471  	selReq := SelectRequest{}
   472  	selReq.Expression = `select _1 from ossobject`
   473  	bo := true
   474  	selReq.OutputSerializationSelect.OutputRawData = &bo
   475  
   476  	ret, err := s.bucket.SelectObject(key, selReq)
   477  	c.Assert(err, IsNil)
   478  	defer ret.Close()
   479  	ts, err := ioutil.ReadAll(ret)
   480  	c.Assert(err, IsNil)
   481  	c.Assert(string(ts), Equals, "abc\n")
   482  
   483  	err = s.bucket.DeleteObject(key)
   484  	c.Assert(err, IsNil)
   485  }
   486  
   487  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithKeepColumns(c *C) {
   488  	key := "sample_data.csv"
   489  	content := "abc,def\n"
   490  	err := s.bucket.PutObject(key, strings.NewReader(content))
   491  	c.Assert(err, IsNil)
   492  	selReq := SelectRequest{}
   493  	selReq.Expression = `select _1 from ossobject`
   494  	bo := true
   495  	selReq.OutputSerializationSelect.KeepAllColumns = &bo
   496  
   497  	ret, err := s.bucket.SelectObject(key, selReq)
   498  	c.Assert(err, IsNil)
   499  	defer ret.Close()
   500  	ts, err := ioutil.ReadAll(ret)
   501  	c.Assert(err, IsNil)
   502  	c.Assert(string(ts), Equals, "abc,\n")
   503  
   504  	err = s.bucket.DeleteObject(key)
   505  	c.Assert(err, IsNil)
   506  }
   507  
   508  func (s *OssSelectCsvSuite) TestSelectCsvObjectWithOutputHeader(c *C) {
   509  	key := "sample_data.csv"
   510  	content := "name,job\nabc,def\n"
   511  	err := s.bucket.PutObject(key, strings.NewReader(content))
   512  	c.Assert(err, IsNil)
   513  	selReq := SelectRequest{}
   514  	selReq.Expression = `select name from ossobject`
   515  	bo := true
   516  	selReq.OutputSerializationSelect.OutputHeader = &bo
   517  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   518  
   519  	ret, err := s.bucket.SelectObject(key, selReq)
   520  	c.Assert(err, IsNil)
   521  	defer ret.Close()
   522  	ts, err := ioutil.ReadAll(ret)
   523  	c.Assert(err, IsNil)
   524  	c.Assert(string(ts), Equals, "name\nabc\n")
   525  
   526  	err = s.bucket.DeleteObject(key)
   527  	c.Assert(err, IsNil)
   528  }
   529  
   530  func (s *OssSelectCsvSuite) TestSelectCsvObjectRead(c *C) {
   531  	key := "sample_data.csv"
   532  	content := "name,job\nabc,def\n"
   533  	err := s.bucket.PutObject(key, strings.NewReader(content))
   534  	c.Assert(err, IsNil)
   535  	selReq := SelectRequest{}
   536  	selReq.Expression = `select name from ossobject`
   537  	bo := true
   538  	selReq.OutputSerializationSelect.OutputHeader = &bo
   539  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   540  	selReq.OutputSerializationSelect.EnablePayloadCrc = &bo
   541  
   542  	ret, err := s.bucket.SelectObject(key, selReq)
   543  	c.Assert(err, IsNil)
   544  	defer ret.Close()
   545  
   546  	// case 1: read length > data length
   547  	p := make([]byte, 512)
   548  	n, err := ret.Read(p[:20])
   549  	if err != nil && err != io.EOF {
   550  		c.Assert(err, IsNil)
   551  	}
   552  	c.Assert(string(p[:n]), Equals, "name\nabc\n")
   553  	ts, err := ioutil.ReadAll(ret)
   554  	c.Assert(err, IsNil)
   555  	c.Assert(string(ts), Equals, "")
   556  
   557  	// case 2: read length = data length
   558  	ret, err = s.bucket.SelectObject(key, selReq)
   559  	c.Assert(err, IsNil)
   560  	defer ret.Close()
   561  	n, err = ret.Read(p[:9])
   562  	if err != nil && err != io.EOF {
   563  		c.Assert(err, IsNil)
   564  	}
   565  	c.Assert(string(p[:n]), Equals, "name\nabc\n")
   566  	ts, err = ioutil.ReadAll(ret)
   567  	c.Assert(err, IsNil)
   568  	c.Assert(string(ts), Equals, "")
   569  
   570  	// case 3: read length > one frame length and read length < two frame, (this data = 2 * frame length)
   571  	ret, err = s.bucket.SelectObject(key, selReq)
   572  	c.Assert(err, IsNil)
   573  	defer ret.Close()
   574  	n, err = ret.Read(p[:7])
   575  	if err != nil && err != io.EOF {
   576  		c.Assert(err, IsNil)
   577  	}
   578  	c.Assert(string(p[:n]), Equals, "name\nab")
   579  	ts, err = ioutil.ReadAll(ret)
   580  	c.Assert(err, IsNil)
   581  	c.Assert(string(ts), Equals, "c\n")
   582  
   583  	// case 4: read length = a frame length (this data = 2 * frame length)
   584  	ret, err = s.bucket.SelectObject(key, selReq)
   585  	c.Assert(err, IsNil)
   586  	defer ret.Close()
   587  	n, err = ret.Read(p[:5])
   588  	if err != nil && err != io.EOF {
   589  		c.Assert(err, IsNil)
   590  	}
   591  	c.Assert(string(p[:n]), Equals, "name\n")
   592  	ts, err = ioutil.ReadAll(ret)
   593  	c.Assert(err, IsNil)
   594  	c.Assert(string(ts), Equals, "abc\n")
   595  
   596  	// case 5: read length < a frame length (this data = 2 * frame length)
   597  	ret, err = s.bucket.SelectObject(key, selReq)
   598  	c.Assert(err, IsNil)
   599  	defer ret.Close()
   600  	n, err = ret.Read(p[:3])
   601  	if err != nil && err != io.EOF {
   602  		c.Assert(err, IsNil)
   603  	}
   604  	c.Assert(string(p[:n]), Equals, "nam")
   605  	ts, err = ioutil.ReadAll(ret)
   606  	c.Assert(err, IsNil)
   607  	c.Assert(string(ts), Equals, "e\nabc\n")
   608  
   609  	err = s.bucket.DeleteObject(key)
   610  	c.Assert(err, IsNil)
   611  }
   612  
   613  // OssProgressListener is the progress listener
   614  type OssSelectProgressListener struct {
   615  }
   616  
   617  // ProgressChanged handles progress event
   618  func (listener *OssSelectProgressListener) ProgressChanged(event *ProgressEvent) {
   619  	switch event.EventType {
   620  	case TransferStartedEvent:
   621  		testLogger.Printf("Transfer Started.\n")
   622  	case TransferDataEvent:
   623  		testLogger.Printf("Transfer Data, This time consumedBytes: %d \n", event.ConsumedBytes)
   624  	case TransferCompletedEvent:
   625  		testLogger.Printf("Transfer Completed, This time consumedBytes: %d.\n", event.ConsumedBytes)
   626  	case TransferFailedEvent:
   627  		testLogger.Printf("Transfer Failed, This time consumedBytes: %d.\n", event.ConsumedBytes)
   628  	default:
   629  	}
   630  }
   631  
   632  func (s *OssSelectCsvSuite) TestSelectCsvObjectConcatProgress(c *C) {
   633  	key := "sample_data.csv"
   634  	localCsvFile := "../sample/sample_data.csv"
   635  	err := s.bucket.PutObjectFromFile(key, localCsvFile)
   636  	c.Assert(err, IsNil)
   637  	selReq := SelectRequest{}
   638  	selReq.Expression = `select Year,StateAbbr, CityName, Short_Question_Text from ossobject where (data_value || data_value_unit) = '14.8%'`
   639  	selReq.InputSerializationSelect.CsvBodyInput.FileHeaderInfo = "Use"
   640  	ret, err := s.bucket.SelectObject(key, selReq, Progress(&OssSelectProgressListener{}))
   641  	c.Assert(err, IsNil)
   642  	defer ret.Close()
   643  	ts, err := ioutil.ReadAll(ret)
   644  	c.Assert(err, IsNil)
   645  
   646  	str, err := readCsvConcat(localCsvFile)
   647  	c.Assert(err, IsNil)
   648  	c.Assert(string(ts), Equals, str)
   649  
   650  	err = s.bucket.DeleteObject(key)
   651  	c.Assert(err, IsNil)
   652  }