package clause

import 

// Limit limit clause
type Limit struct {
	Limit  *int
	Offset int
}

// Name where clause name
func ( Limit) () string {
	return "LIMIT"
}

// Build build where clause
func ( Limit) ( Builder) {
	if .Limit != nil && *.Limit >= 0 {
		.WriteString("LIMIT ")
		.WriteString(strconv.Itoa(*.Limit))
	}
	if .Offset > 0 {
		if .Limit != nil && *.Limit >= 0 {
			.WriteByte(' ')
		}
		.WriteString("OFFSET ")
		.WriteString(strconv.Itoa(.Offset))
	}
}

// MergeClause merge order by clauses
func ( Limit) ( *Clause) {
	.Name = ""

	if ,  := .Expression.(Limit);  {
		if (.Limit == nil || *.Limit == 0) && .Limit != nil {
			.Limit = .Limit
		}

		if .Offset == 0 && .Offset > 0 {
			.Offset = .Offset
		} else if .Offset < 0 {
			.Offset = 0
		}
	}

	.Expression = 
}