예제 #1
0
파일: router.go 프로젝트: lengy/mixer
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
}