func (r *Router) generateSelectSql(plan *Plan, stmt sqlparser.Statement) error { sqls := make(map[string][]string) node, ok := stmt.(*sqlparser.Select) if ok == false { return errors.ErrStmtConvert } if len(plan.RouteNodeIndexs) == 0 { return errors.ErrNoRouteNode } if len(plan.RouteTableIndexs) == 0 { buf := sqlparser.NewTrackedBuffer(nil) stmt.Format(buf) nodeName := r.Nodes[0] sqls[nodeName] = []string{buf.String()} } else { tableCount := len(plan.RouteTableIndexs) for i := 0; i < tableCount; i++ { tableIndex := plan.RouteTableIndexs[i] nodeIndex := plan.Rule.TableToNode[tableIndex] nodeName := r.Nodes[nodeIndex] selectSql := r.rewriteSelectSql(plan, node, tableIndex) if _, ok := sqls[nodeName]; ok == false { sqls[nodeName] = make([]string, 0, tableCount) } sqls[nodeName] = append(sqls[nodeName], selectSql) } } plan.RewrittenSqls = sqls return nil }
func (r *Router) generateReplaceSql(plan *Plan, stmt sqlparser.Statement) error { sqls := make(map[string][]string) node, ok := stmt.(*sqlparser.Replace) if ok == false { return errors.ErrStmtConvert } if len(plan.RouteNodeIndexs) == 0 { return errors.ErrNoRouteNode } if len(plan.RouteTableIndexs) == 0 { buf := sqlparser.NewTrackedBuffer(nil) stmt.Format(buf) nodeName := r.Nodes[0] sqls[nodeName] = []string{buf.String()} } else { tableCount := len(plan.RouteTableIndexs) for i := 0; i < tableCount; i++ { tableIndex := plan.RouteTableIndexs[i] nodeIndex := plan.Rule.TableToNode[tableIndex] nodeName := r.Nodes[nodeIndex] buf := sqlparser.NewTrackedBuffer(nil) buf.Fprintf("replace %vinto %v", node.Comments, node.Table, ) fmt.Fprintf(buf, "_%04d", plan.RouteTableIndexs[i]) buf.Fprintf("%v %v", node.Columns, plan.Rows[tableIndex], ) if _, ok := sqls[nodeName]; ok == false { sqls[nodeName] = make([]string, 0, tableCount) } sqls[nodeName] = append(sqls[nodeName], buf.String()) } } plan.RewrittenSqls = sqls return nil }