52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package find
|
|
|
|
import (
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
type sqlCalcFound struct{}
|
|
|
|
// Creates a new Clause which adds `SQL_CALC_FOUND_ROWS` right after `SELECT`.
|
|
// If [find.FoundRowsCallback] is registered the presence of this clause will
|
|
// cause `FOUND_ROWS()` result to be available in the driver context.
|
|
func SqlCalcFound() sqlCalcFound {
|
|
return sqlCalcFound{}
|
|
}
|
|
|
|
// Implements gorm's [clause.Clause]
|
|
func (sqlCalcFound) Name() string {
|
|
return "SQL_CALC_FOUND_ROWS"
|
|
}
|
|
|
|
// Implements gorm's [clause.Clause]
|
|
func (sqlCalcFound) Build(builder clause.Builder) {
|
|
_, _ = builder.WriteString("SQL_CALC_FOUND_ROWS")
|
|
}
|
|
|
|
// Implements gorm's [clause.Clause]
|
|
func (sqlCalcFound) MergeClause(cl *clause.Clause) {
|
|
}
|
|
|
|
// Implements [gorm.StatementModifier]
|
|
func (calc sqlCalcFound) ModifyStatement(stmt *gorm.Statement) {
|
|
selectClause := stmt.Clauses["SELECT"]
|
|
if selectClause.AfterNameExpression == nil {
|
|
selectClause.AfterNameExpression = calc
|
|
} else if _, ok := selectClause.AfterNameExpression.(sqlCalcFound); !ok {
|
|
selectClause.AfterNameExpression = exprs{selectClause.AfterNameExpression, calc}
|
|
}
|
|
stmt.Clauses["SELECT"] = selectClause
|
|
}
|
|
|
|
type exprs []clause.Expression
|
|
|
|
func (exprs exprs) Build(builder clause.Builder) {
|
|
for idx, expr := range exprs {
|
|
if idx > 0 {
|
|
_ = builder.WriteByte(' ')
|
|
}
|
|
expr.Build(builder)
|
|
}
|
|
}
|