func getRoutingPlan(statement Statement, router *router.Router) (plan *RoutingPlan) { plan = &RoutingPlan{} var where *Where switch stmt := statement.(type) { case *Insert: if _, ok := stmt.Rows.(SelectStatement); ok { panic(NewParserError("select in insert not allowed")) } plan.rule = router.GetRule(String(stmt.Table)) if stmt.OnDup != nil { checkUpdateExprs(UpdateExprs(stmt.OnDup), plan.rule) } plan.criteria = plan.routingAnalyzeValues(stmt.Rows.(Values)) plan.fullList = makeList(0, len(plan.rule.Nodes)) return plan case *Replace: if _, ok := stmt.Rows.(SelectStatement); ok { panic(NewParserError("select in replace not allowed")) } plan.rule = router.GetRule(String(stmt.Table)) plan.criteria = plan.routingAnalyzeValues(stmt.Rows.(Values)) plan.fullList = makeList(0, len(plan.rule.Nodes)) return plan case *Select: plan.rule = router.GetRule(String(stmt.From[0])) where = stmt.Where case *Update: plan.rule = router.GetRule(String(stmt.Table)) checkUpdateExprs(stmt.Exprs, plan.rule) where = stmt.Where case *Delete: plan.rule = router.GetRule(String(stmt.Table)) where = stmt.Where } if where != nil { plan.criteria = where.Expr } else { plan.rule = router.DefaultRule } plan.fullList = makeList(0, len(plan.rule.Nodes)) return plan }