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 }