querygroup.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package source
  2. type QueryGroup struct {
  3. errorCollector *QueryErrorCollector
  4. }
  5. type QueryGroupAsyncResult struct {
  6. errorCollector *QueryErrorCollector
  7. resultsChan QueryResultsChan
  8. }
  9. func NewQueryGroup() *QueryGroup {
  10. var errorCollector QueryErrorCollector
  11. return &QueryGroup{
  12. errorCollector: &errorCollector,
  13. }
  14. }
  15. func (qg *QueryGroup) With(resultsChan QueryResultsChan) *QueryGroupAsyncResult {
  16. return newQueryGroupAsyncResult(qg.errorCollector, resultsChan)
  17. }
  18. func (qg *QueryGroup) HasErrors() bool {
  19. return qg.errorCollector.IsError()
  20. }
  21. func (qg *QueryGroup) Error() error {
  22. return qg.errorCollector
  23. }
  24. func (qg *QueryGroup) Errors() []*QueryError {
  25. return qg.errorCollector.Errors()
  26. }
  27. func newQueryGroupAsyncResult(collector *QueryErrorCollector, resultsChan QueryResultsChan) *QueryGroupAsyncResult {
  28. return &QueryGroupAsyncResult{
  29. errorCollector: collector,
  30. resultsChan: resultsChan,
  31. }
  32. }
  33. func (qgar *QueryGroupAsyncResult) Await() ([]*QueryResult, error) {
  34. defer close(qgar.resultsChan)
  35. result := <-qgar.resultsChan
  36. q := result.Query
  37. err := result.Error
  38. if err != nil {
  39. qgar.errorCollector.AppendError(&QueryError{Query: q, Error: err})
  40. return nil, err
  41. }
  42. return result.Results, nil
  43. }
  44. type QueryResultCollection []*QueryResults
  45. func (qrc *QueryResultCollection) HasErrors() bool {
  46. for _, qr := range *qrc {
  47. if qr.Error != nil {
  48. return true
  49. }
  50. }
  51. return false
  52. }
  53. func (qrc *QueryResultCollection) Error() error {
  54. var errCollection QueryErrorCollector
  55. for _, qr := range *qrc {
  56. q := qr.Query
  57. e := qr.Error
  58. if e != nil {
  59. if IsErrorCollection(e) {
  60. if errs, ok := e.(QueryErrorCollection); ok {
  61. for _, qErr := range errs.Errors() {
  62. errCollection.AppendError(qErr)
  63. }
  64. for _, qWarn := range errs.Warnings() {
  65. errCollection.AppendWarning(qWarn)
  66. }
  67. } else {
  68. errCollection.AppendError(&QueryError{Query: q, Error: e})
  69. }
  70. } else {
  71. errCollection.AppendError(&QueryError{Query: q, Error: e})
  72. }
  73. }
  74. }
  75. return &errCollection
  76. }