github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/select_json_object_test.go (about) 1 package oss 2 3 import ( 4 "io/ioutil" 5 "net/http" 6 "os" 7 "strings" 8 9 . "gopkg.in/check.v1" 10 ) 11 12 type OssSelectJsonSuite struct { 13 cloudBoxControlClient *Client 14 client *Client 15 bucket *Bucket 16 } 17 18 var _ = Suite(&OssSelectJsonSuite{}) 19 20 func (s *OssSelectJsonSuite) SetUpSuite(c *C) { 21 bucketName := bucketNamePrefix + RandLowStr(6) 22 if cloudboxControlEndpoint == "" { 23 client, err := New(endpoint, accessID, accessKey) 24 c.Assert(err, IsNil) 25 s.client = client 26 s.client.Config.LogLevel = Error // Debug 27 err = s.client.CreateBucket(bucketName) 28 c.Assert(err, IsNil) 29 bucket, err := s.client.Bucket(bucketName) 30 c.Assert(err, IsNil) 31 s.bucket = bucket 32 } else { 33 client, err := New(cloudboxEndpoint, accessID, accessKey) 34 c.Assert(err, IsNil) 35 s.client = client 36 37 controlClient, err := New(cloudboxControlEndpoint, accessID, accessKey) 38 c.Assert(err, IsNil) 39 s.cloudBoxControlClient = controlClient 40 controlClient.CreateBucket(bucketName) 41 42 bucket, err := s.client.Bucket(bucketName) 43 c.Assert(err, IsNil) 44 s.bucket = bucket 45 } 46 47 testLogger.Println("test select json started") 48 } 49 50 func (s *OssSelectJsonSuite) TearDownSuite(c *C) { 51 // Delete objects 52 marker := Marker("") 53 for { 54 lor, err := s.bucket.ListObjects(marker) 55 c.Assert(err, IsNil) 56 for _, object := range lor.Objects { 57 err = s.bucket.DeleteObject(object.Key) 58 c.Assert(err, IsNil) 59 } 60 marker = Marker(lor.NextMarker) 61 if !lor.IsTruncated { 62 break 63 } 64 } 65 66 // Delete bucket 67 if s.cloudBoxControlClient != nil { 68 err := s.cloudBoxControlClient.DeleteBucket(s.bucket.BucketName) 69 c.Assert(err, IsNil) 70 } else { 71 err := s.client.DeleteBucket(s.bucket.BucketName) 72 c.Assert(err, IsNil) 73 } 74 75 testLogger.Println("test select json completed") 76 } 77 78 func (s *OssSelectJsonSuite) SetUpTest(c *C) { 79 testLogger.Println("test func", c.TestName(), "start") 80 } 81 82 func (s *OssSelectJsonSuite) TearDownTest(c *C) { 83 testLogger.Println("test func", c.TestName(), "succeed") 84 } 85 86 func (s *OssSelectJsonSuite) TestCreateSelectJsonObjectMeta(c *C) { 87 key := "sample_json_lines.json" 88 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 89 c.Assert(err, IsNil) 90 jsonMeta := JsonMetaRequest{ 91 InputSerialization: InputSerialization{ 92 JSON: JSON{ 93 JSONType: "LINES", 94 }, 95 }, 96 } 97 res, err := s.bucket.CreateSelectJsonObjectMeta(key, jsonMeta) 98 c.Assert(err, IsNil) 99 c.Assert(res.RowsCount, Equals, int64(100)) 100 101 err = s.bucket.DeleteObject(key) 102 c.Assert(err, IsNil) 103 } 104 105 func (s *OssSelectJsonSuite) TestSelectJsonDocument(c *C) { 106 key := "sample_json.json" 107 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 108 c.Assert(err, IsNil) 109 selReq := SelectRequest{} 110 selReq.Expression = "select * from ossobject.objects[*] where party = 'Democrat'" 111 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "DOCUMENT" 112 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 113 114 var responseHeader http.Header 115 body, err := s.bucket.SelectObject(key, selReq, GetResponseHeader(&responseHeader)) 116 c.Assert(err, IsNil) 117 defer body.Close() 118 requestId := GetRequestId(responseHeader) 119 c.Assert(len(requestId) > 0, Equals, true) 120 121 p := make([]byte, 512) 122 n, err := body.Read(p) 123 c.Assert(err, IsNil) 124 c.Assert(n, Equals, 512) 125 p1 := make([]byte, 3) 126 _, err = body.Read(p1) 127 c.Assert(err, IsNil) 128 rets, err := ioutil.ReadAll(body) 129 c.Assert(err, IsNil) 130 str, err := readJsonDocument("../sample/sample_json.json") 131 c.Assert(err, IsNil) 132 c.Assert(string(p)+string(p1)+string(rets), Equals, escaped_slashs(str)) 133 134 err = s.bucket.DeleteObject(key) 135 c.Assert(err, IsNil) 136 } 137 138 func (s *OssSelectJsonSuite) TestSelectJsonLines(c *C) { 139 key := "sample_json_lines.json" 140 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 141 c.Assert(err, IsNil) 142 selReq := SelectRequest{} 143 selReq.Expression = "select * from ossobject where party = 'Democrat'" 144 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 145 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 146 147 var responseHeader http.Header 148 body, err := s.bucket.SelectObject(key, selReq, GetResponseHeader(&responseHeader)) 149 c.Assert(err, IsNil) 150 defer body.Close() 151 152 requestId := GetRequestId(responseHeader) 153 c.Assert(len(requestId) > 0, Equals, true) 154 155 rets, err := ioutil.ReadAll(body) 156 c.Assert(err, IsNil) 157 str, err := readJsonDocument("../sample/sample_json.json") 158 c.Assert(string(rets), Equals, escaped_slashs(str)) 159 160 err = s.bucket.DeleteObject(key) 161 c.Assert(err, IsNil) 162 } 163 164 func (s *OssSelectJsonSuite) TestSelectJsonLinesIntoFile(c *C) { 165 key := "sample_json_lines.json" 166 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 167 c.Assert(err, IsNil) 168 169 jsonMeta := JsonMetaRequest{ 170 InputSerialization: InputSerialization{ 171 JSON: JSON{ 172 JSONType: "LINES", 173 }, 174 }, 175 } 176 res, err := s.bucket.CreateSelectJsonObjectMeta(key, jsonMeta) 177 c.Assert(err, IsNil) 178 c.Assert(res.RowsCount, Equals, int64(100)) 179 180 selReq := SelectRequest{} 181 selReq.Expression = "select * from ossobject where party = 'Democrat'" 182 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 183 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 184 185 var responseHeader http.Header 186 outfile := "sample_json_out.json" 187 err = s.bucket.SelectObjectIntoFile(key, outfile, selReq, GetResponseHeader(&responseHeader)) 188 c.Assert(err, IsNil) 189 requestId := GetRequestId(responseHeader) 190 c.Assert(len(requestId) > 0, Equals, true) 191 192 _, err = os.Stat(outfile) 193 c.Assert(err, IsNil) 194 err = os.Remove(outfile) 195 c.Assert(err, IsNil) 196 197 err = s.bucket.DeleteObject(key) 198 c.Assert(err, IsNil) 199 } 200 201 func (s *OssSelectJsonSuite) TestSelectJsonDocumentIntoFile(c *C) { 202 key := "sample_json_lines.json" 203 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 204 c.Assert(err, IsNil) 205 206 selReq := SelectRequest{} 207 selReq.Expression = "select * from ossobject.objects[*] where party = 'Democrat'" 208 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 209 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "DOCUMENT" 210 211 var responseHeader http.Header 212 outfile := "sample_json_out.json" 213 err = s.bucket.SelectObjectIntoFile(key, outfile, selReq, GetResponseHeader(&responseHeader)) 214 c.Assert(err, IsNil) 215 requestId := GetRequestId(responseHeader) 216 c.Assert(len(requestId) > 0, Equals, true) 217 218 _, err = os.Stat(outfile) 219 c.Assert(err, IsNil) 220 err = os.Remove(outfile) 221 c.Assert(err, IsNil) 222 223 err = s.bucket.DeleteObject(key) 224 c.Assert(err, IsNil) 225 } 226 227 func (s *OssSelectJsonSuite) TestSelectJsonLinesLike(c *C) { 228 key := "sample_json_lines.json" 229 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 230 c.Assert(err, IsNil) 231 selReq := SelectRequest{} 232 selReq.Expression = "select person.firstname, person.lastname from ossobject where person.birthday like '1959%'" 233 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 234 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 235 236 jsonMeta := JsonMetaRequest{ 237 InputSerialization: InputSerialization{ 238 JSON: JSON{ 239 JSONType: "LINES", 240 }, 241 }, 242 } 243 res, err := s.bucket.CreateSelectJsonObjectMeta(key, jsonMeta) 244 c.Assert(err, IsNil) 245 c.Assert(res.RowsCount, Equals, int64(100)) 246 247 var responseHeader http.Header 248 body, err := s.bucket.SelectObject(key, selReq, GetResponseHeader(&responseHeader)) 249 c.Assert(err, IsNil) 250 defer body.Close() 251 252 requestId := GetRequestId(responseHeader) 253 c.Assert(len(requestId) > 0, Equals, true) 254 255 rets, err := ioutil.ReadAll(body) 256 c.Assert(err, IsNil) 257 str, err := readJsonLinesLike("../sample/sample_json.json") 258 c.Assert(string(rets), Equals, str) 259 260 err = s.bucket.DeleteObject(key) 261 c.Assert(err, IsNil) 262 } 263 264 func (s *OssSelectJsonSuite) TestSelectJsonLinesRange(c *C) { 265 key := "sample_json_lines.json" 266 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 267 c.Assert(err, IsNil) 268 jsonMeta := JsonMetaRequest{ 269 InputSerialization: InputSerialization{ 270 JSON: JSON{ 271 JSONType: "LINES", 272 }, 273 }, 274 } 275 res, err := s.bucket.CreateSelectJsonObjectMeta(key, jsonMeta) 276 c.Assert(err, IsNil) 277 c.Assert(res.RowsCount, Equals, int64(100)) 278 279 selReq := SelectRequest{} 280 selReq.Expression = "select person.firstname as aaa as firstname, person.lastname, extra from ossobject'" 281 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 282 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 283 selReq.InputSerializationSelect.JsonBodyInput.Range = "0-1" 284 285 var responseHeader http.Header 286 body, err := s.bucket.SelectObject(key, selReq, GetResponseHeader(&responseHeader)) 287 c.Assert(err, IsNil) 288 defer body.Close() 289 290 requestId := GetRequestId(responseHeader) 291 c.Assert(len(requestId) > 0, Equals, true) 292 293 rets, err := ioutil.ReadAll(body) 294 c.Assert(err, IsNil) 295 str, err := readJsonLinesRange("../sample/sample_json.json", 0, 2) 296 c.Assert(string(rets), Equals, escaped_slashs(str)) 297 298 err = s.bucket.DeleteObject(key) 299 c.Assert(err, IsNil) 300 } 301 302 func (s *OssSelectJsonSuite) TestSelectJsonDocumentIntAggregation(c *C) { 303 key := "sample_json.json" 304 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 305 c.Assert(err, IsNil) 306 307 selReq := SelectRequest{} 308 selReq.Expression = ` 309 select 310 avg(cast(person.cspanid as int)), max(cast(person.cspanid as int)), 311 min(cast(person.cspanid as int)) 312 from 313 ossobject.objects[*] 314 where 315 person.cspanid = 1011723 316 ` 317 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 318 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "Document" 319 320 body, err := s.bucket.SelectObject(key, selReq) 321 c.Assert(err, IsNil) 322 defer body.Close() 323 324 rets, err := ioutil.ReadAll(body) 325 c.Assert(err, IsNil) 326 c.Assert(string(rets), Equals, "{\"_1\":1011723,\"_2\":1011723,\"_3\":1011723},") 327 328 err = s.bucket.DeleteObject(key) 329 c.Assert(err, IsNil) 330 } 331 332 func (s *OssSelectJsonSuite) TestSelectJsonDocumentFloatAggregation(c *C) { 333 key := "sample_json.json" 334 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 335 c.Assert(err, IsNil) 336 337 selReq := SelectRequest{} 338 selReq.Expression = ` 339 select 340 avg(cast(person.cspanid as double)), max(cast(person.cspanid as double)), 341 min(cast(person.cspanid as double)) 342 from 343 ossobject.objects[*] 344 ` 345 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 346 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "Document" 347 348 body, err := s.bucket.SelectObject(key, selReq) 349 c.Assert(err, IsNil) 350 defer body.Close() 351 352 rets, err := ioutil.ReadAll(body) 353 c.Assert(err, IsNil) 354 testLogger.Println(string(rets)) 355 // avg, max, min, err := readJsonFloatAggregation("../sample/sample_json.json") 356 // fmt.Println(string(rets), "\n", avg, max, min) 357 // retsArr := strings.Split(string(rets), ":") 358 // s1 := strconv.FormatFloat(avg, 'f', 6, 64) + "," 359 // s1 += strconv.FormatFloat(max, 'f', 6, 64) + "," 360 // s1 += strconv.FormatFloat(min, 'f', 6, 64) + "," 361 // retS := "" 362 // l := len(retsArr[1]) 363 // vv, err := strconv.ParseFloat(retsArr[1][:l-35], 64) 364 // c.Assert(err, IsNil) 365 // retS += strconv.FormatFloat(vv, 'f', 6, 64) + "," 366 // l = len(retsArr[2]) 367 // vv, err = strconv.ParseFloat(retsArr[2][:l-6], 64) 368 // c.Assert(err, IsNil) 369 // retS += strconv.FormatFloat(vv, 'f', 6, 64) + "," 370 // l = len(retsArr[3]) 371 // vv, err = strconv.ParseFloat(retsArr[3][:l-2], 64) 372 // c.Assert(err, IsNil) 373 // retS += strconv.FormatFloat(vv, 'f', 6, 64) + "," 374 // c.Assert(retS, Equals, s1) 375 376 err = s.bucket.DeleteObject(key) 377 c.Assert(err, IsNil) 378 } 379 380 func (s *OssSelectJsonSuite) TestSelectJsonDocumentConcat(c *C) { 381 key := "sample_json.json" 382 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 383 c.Assert(err, IsNil) 384 385 selReq := SelectRequest{} 386 selReq.Expression = ` 387 select 388 person 389 from 390 ossobject.objects[*] 391 where 392 (person.firstname || person.lastname) = 'JohnKennedy' 393 ` 394 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 395 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "Document" 396 397 body, err := s.bucket.SelectObject(key, selReq) 398 c.Assert(err, IsNil) 399 defer body.Close() 400 401 rets, err := ioutil.ReadAll(body) 402 c.Assert(err, IsNil) 403 str, err := readJsonDocumentConcat("../sample/sample_json.json") 404 c.Assert(err, IsNil) 405 c.Assert(string(rets), Equals, escaped_slashs(str)) 406 407 err = s.bucket.DeleteObject(key) 408 c.Assert(err, IsNil) 409 } 410 411 func (s *OssSelectJsonSuite) TestSelectJsonComplicateConcat(c *C) { 412 key := "sample_json.json" 413 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 414 c.Assert(err, IsNil) 415 416 selReq := SelectRequest{} 417 selReq.Expression = ` 418 select 419 person.firstname, person.lastname, congress_numbers 420 from 421 ossobject 422 where 423 startdate > '2017-01-01' and 424 senator_rank = 'junior' or 425 state = 'CA' and 426 party = 'Republican' 427 ` 428 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 429 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 430 431 body, err := s.bucket.SelectObject(key, selReq) 432 c.Assert(err, IsNil) 433 defer body.Close() 434 435 rets, err := ioutil.ReadAll(body) 436 c.Assert(err, IsNil) 437 str, err := readJsonComplicateConcat("../sample/sample_json.json") 438 c.Assert(err, IsNil) 439 c.Assert(string(rets), Equals, str) 440 441 err = s.bucket.DeleteObject(key) 442 c.Assert(err, IsNil) 443 } 444 445 func (s *OssSelectJsonSuite) TestSelectJsonLineInvalidSql(c *C) { 446 key := "sample_json.json" 447 err := s.bucket.PutObjectFromFile(key, "../sample/sample_json_lines.json") 448 c.Assert(err, IsNil) 449 450 selReq := SelectRequest{} 451 selReq.OutputSerializationSelect.JsonBodyOutput.RecordDelimiter = "," 452 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "LINES" 453 454 selReq.Expression = `select * from ossobject where avg(cast(person.birthday as int)) > 2016` 455 _, err = s.bucket.SelectObject(key, selReq) 456 c.Assert(err, NotNil) 457 458 selReq.Expression = `` 459 _, err = s.bucket.SelectObject(key, selReq) 460 c.Assert(err, NotNil) 461 462 selReq.Expression = `select person.lastname || person.firstname from ossobject` 463 _, err = s.bucket.SelectObject(key, selReq) 464 c.Assert(err, NotNil) 465 466 selReq.Expression = `select * from ossobject group by person.firstname` 467 _, err = s.bucket.SelectObject(key, selReq) 468 c.Assert(err, NotNil) 469 470 selReq.Expression = `select * from ossobject order by _1` 471 _, err = s.bucket.SelectObject(key, selReq) 472 c.Assert(err, NotNil) 473 474 selReq.Expression = `select * from ossobject oss join s3object s3 on oss.CityName = s3.CityName` 475 _, err = s.bucket.SelectObject(key, selReq) 476 c.Assert(err, NotNil) 477 478 err = s.bucket.PutObjectFromFile(key, "../sample/sample_json.json") 479 c.Assert(err, IsNil) 480 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "DOCUMENT" 481 selReq.Expression = `select _1 from ossobject.objects[*]` 482 body, err := s.bucket.SelectObject(key, selReq) 483 c.Assert(err, IsNil) 484 defer body.Close() 485 486 err = s.bucket.DeleteObject(key) 487 c.Assert(err, IsNil) 488 } 489 490 func (s *OssSelectJsonSuite) TestSelectJsonParseNumAsString(c *C) { 491 key := "sample_json.json" 492 content := "{\"a\":123456789.123456789}" 493 err := s.bucket.PutObject(key, strings.NewReader(content)) 494 c.Assert(err, IsNil) 495 496 selReq := SelectRequest{} 497 selReq.Expression = `select a from ossobject where cast(a as decimal) = 123456789.1234567890` 498 bo := true 499 selReq.InputSerializationSelect.JsonBodyInput.ParseJSONNumberAsString = &bo 500 selReq.InputSerializationSelect.JsonBodyInput.JSONType = "DOCUMENT" 501 502 body, err := s.bucket.SelectObject(key, selReq) 503 c.Assert(err, IsNil) 504 defer body.Close() 505 506 rets, err := ioutil.ReadAll(body) 507 c.Assert(err, IsNil) 508 c.Assert(string(rets), Equals, "{\"a\":123456789.123456789}\n") 509 510 err = s.bucket.DeleteObject(key) 511 c.Assert(err, IsNil) 512 } 513 514 func escaped_slashs(value string) string { 515 return strings.Replace(value, "/", "\\/", -1) 516 }