(planString string)
| 97 | } |
| 98 | |
| 99 | func getAffectedRowsFromOceanBaseQueryPlan(planString string) (int64, error) { |
| 100 | var planValue map[string]json.RawMessage |
| 101 | if err := json.Unmarshal([]byte(planString), &planValue); err != nil { |
| 102 | return 0, errors.Wrapf(err, "failed to parse query plan from string: %+v", planString) |
| 103 | } |
| 104 | if len(planValue) == 0 { |
| 105 | return 0, nil |
| 106 | } |
| 107 | queryPlan := oceanBaseQueryPlan{} |
| 108 | if err := queryPlan.Unmarshal(planValue); err != nil { |
| 109 | return 0, errors.Wrapf(err, "failed to parse query plan from map: %+v", planValue) |
| 110 | } |
| 111 | if queryPlan.Operator != "" { |
| 112 | return queryPlan.EstRows, nil |
| 113 | } |
| 114 | count := int64(-1) |
| 115 | for k, v := range planValue { |
| 116 | if !strings.HasPrefix(k, "CHILD_") { |
| 117 | continue |
| 118 | } |
| 119 | child := oceanBaseQueryPlan{} |
| 120 | if err := child.Unmarshal(v); err != nil { |
| 121 | return 0, errors.Wrapf(err, "failed to parse field '%s', value: %+v", k, v) |
| 122 | } |
| 123 | if child.Operator != "" && child.EstRows > count { |
| 124 | count = child.EstRows |
| 125 | } |
| 126 | } |
| 127 | if count >= 0 { |
| 128 | return count, nil |
| 129 | } |
| 130 | return 0, nil |
| 131 | } |
| 132 | |
| 133 | // oceanBaseQueryPlan represents the query plan of OceanBase. |
| 134 | type oceanBaseQueryPlan struct { |
no test coverage detected