// split splits the query into multiple queries. validateQuery() must return // nil error before split() is called. func (qs *QuerySplitter) split(pkMinMax *mproto.QueryResult) []proto.QuerySplit { boundaries := qs.getSplitBoundaries(pkMinMax) splits := []proto.QuerySplit{} // No splits, return the original query as a single split if len(boundaries) == 0 { split := &proto.QuerySplit{ Query: *qs.query, } splits = append(splits, *split) } else { // Loop through the boundaries and generated modified where clauses start := sqltypes.Value{} clauses := []*sqlparser.Where{} for _, end := range boundaries { clauses = append(clauses, qs.getWhereClause(start, end)) start.Inner = end.Inner } clauses = append(clauses, qs.getWhereClause(start, sqltypes.Value{})) // Generate one split per clause for _, clause := range clauses { sel := qs.sel sel.Where = clause q := &proto.BoundQuery{ Sql: sqlparser.String(sel), BindVariables: qs.query.BindVariables, } split := &proto.QuerySplit{ Query: *q, RowCount: qs.rowCount, } splits = append(splits, *split) } } return splits }
// split splits the query into multiple queries. validateQuery() must return // nil error before split() is called. func (qs *QuerySplitter) split(columnType int64, pkMinMax *mproto.QueryResult) ([]proto.QuerySplit, error) { boundaries, err := qs.splitBoundaries(columnType, pkMinMax) if err != nil { return nil, err } splits := []proto.QuerySplit{} // No splits, return the original query as a single split if len(boundaries) == 0 { split := &proto.QuerySplit{ Query: *qs.query, } splits = append(splits, *split) } else { boundaries = append(boundaries, sqltypes.Value{}) whereClause := qs.sel.Where // Loop through the boundaries and generated modified where clauses start := sqltypes.Value{} for _, end := range boundaries { bindVars := make(map[string]interface{}, len(qs.query.BindVariables)) for k, v := range qs.query.BindVariables { bindVars[k] = v } qs.sel.Where = qs.getWhereClause(whereClause, bindVars, start, end) q := &proto.BoundQuery{ Sql: sqlparser.String(qs.sel), BindVariables: bindVars, } split := &proto.QuerySplit{ Query: *q, RowCount: qs.rowCount, } splits = append(splits, *split) start.Inner = end.Inner } qs.sel.Where = whereClause // reset where clause } return splits, err }