2019-08-03 14:10:47 +02:00
|
|
|
package jet
|
|
|
|
|
|
2025-02-28 18:23:15 +01:00
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
2020-02-16 10:25:21 +01:00
|
|
|
|
2019-08-17 18:32:01 +02:00
|
|
|
// Dialect interface
|
2019-08-03 14:10:47 +02:00
|
|
|
type Dialect interface {
|
|
|
|
|
Name() string
|
|
|
|
|
PackageName() string
|
2019-08-15 13:54:05 +02:00
|
|
|
OperatorSerializeOverride(operator string) SerializeOverride
|
2019-08-03 14:10:47 +02:00
|
|
|
AliasQuoteChar() byte
|
|
|
|
|
IdentifierQuoteChar() byte
|
|
|
|
|
ArgumentPlaceholder() QueryPlaceholderFunc
|
2025-02-28 18:23:15 +01:00
|
|
|
ArgumentToString(value any) (string, bool)
|
2020-02-16 10:25:21 +01:00
|
|
|
IsReservedWord(name string) bool
|
2024-02-10 14:03:31 +01:00
|
|
|
SerializeOrderBy() func(expression Expression, ascending, nullsFirst *bool) SerializerFunc
|
2024-10-17 14:12:21 +02:00
|
|
|
ValuesDefaultColumnName(index int) string
|
2025-03-08 19:01:37 +01:00
|
|
|
JsonValueEncode(expr Expression) Expression
|
2026-02-02 13:21:35 +01:00
|
|
|
RegexpLike(str StringExpression, not bool, pattern StringExpression, caseSensitive bool) SerializerFunc
|
2019-08-03 14:10:47 +02:00
|
|
|
}
|
|
|
|
|
|
2019-12-01 18:25:30 +01:00
|
|
|
// SerializerFunc func
|
|
|
|
|
type SerializerFunc func(statement StatementType, out *SQLBuilder, options ...SerializeOption)
|
2019-08-17 18:32:01 +02:00
|
|
|
|
2019-12-08 11:07:49 +01:00
|
|
|
// SerializeOverride func
|
2019-12-01 18:25:30 +01:00
|
|
|
type SerializeOverride func(expressions ...Serializer) SerializerFunc
|
2019-08-17 18:32:01 +02:00
|
|
|
|
|
|
|
|
// QueryPlaceholderFunc func
|
2019-08-03 14:10:47 +02:00
|
|
|
type QueryPlaceholderFunc func(ord int) string
|
|
|
|
|
|
2019-08-17 18:32:01 +02:00
|
|
|
// DialectParams struct
|
2019-08-03 14:10:47 +02:00
|
|
|
type DialectParams struct {
|
2019-08-15 13:54:05 +02:00
|
|
|
Name string
|
|
|
|
|
PackageName string
|
|
|
|
|
OperatorSerializeOverrides map[string]SerializeOverride
|
|
|
|
|
AliasQuoteChar byte
|
|
|
|
|
IdentifierQuoteChar byte
|
|
|
|
|
ArgumentPlaceholder QueryPlaceholderFunc
|
2025-02-28 18:23:15 +01:00
|
|
|
ArgumentToString func(value any) (string, bool)
|
2020-02-16 10:25:21 +01:00
|
|
|
ReservedWords []string
|
2024-02-10 14:03:31 +01:00
|
|
|
SerializeOrderBy func(expression Expression, ascending, nullsFirst *bool) SerializerFunc
|
2024-10-17 14:12:21 +02:00
|
|
|
ValuesDefaultColumnName func(index int) string
|
2025-03-08 19:01:37 +01:00
|
|
|
JsonValueEncode func(expr Expression) Expression
|
2026-02-02 13:21:35 +01:00
|
|
|
RegexpLike func(str StringExpression, not bool, pattern StringExpression, caseSensitive bool) SerializerFunc
|
2019-08-03 14:10:47 +02:00
|
|
|
}
|
|
|
|
|
|
2019-08-17 18:32:01 +02:00
|
|
|
// NewDialect creates new dialect with params
|
2019-08-03 14:10:47 +02:00
|
|
|
func NewDialect(params DialectParams) Dialect {
|
|
|
|
|
return &dialectImpl{
|
2019-08-15 13:54:05 +02:00
|
|
|
name: params.Name,
|
|
|
|
|
packageName: params.PackageName,
|
|
|
|
|
operatorSerializeOverrides: params.OperatorSerializeOverrides,
|
|
|
|
|
aliasQuoteChar: params.AliasQuoteChar,
|
|
|
|
|
identifierQuoteChar: params.IdentifierQuoteChar,
|
|
|
|
|
argumentPlaceholder: params.ArgumentPlaceholder,
|
2025-02-28 18:23:15 +01:00
|
|
|
argumentToString: params.ArgumentToString,
|
2020-02-16 10:25:21 +01:00
|
|
|
reservedWords: arrayOfStringsToMapOfStrings(params.ReservedWords),
|
2024-02-10 14:03:31 +01:00
|
|
|
serializeOrderBy: params.SerializeOrderBy,
|
2024-10-17 14:12:21 +02:00
|
|
|
valuesDefaultColumnName: params.ValuesDefaultColumnName,
|
2025-03-08 19:01:37 +01:00
|
|
|
jsonValueEncode: params.JsonValueEncode,
|
2026-02-02 13:21:35 +01:00
|
|
|
regexpLike: params.RegexpLike,
|
2019-08-03 14:10:47 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type dialectImpl struct {
|
2019-08-15 13:54:05 +02:00
|
|
|
name string
|
|
|
|
|
packageName string
|
|
|
|
|
operatorSerializeOverrides map[string]SerializeOverride
|
|
|
|
|
aliasQuoteChar byte
|
|
|
|
|
identifierQuoteChar byte
|
|
|
|
|
argumentPlaceholder QueryPlaceholderFunc
|
2025-02-28 18:23:15 +01:00
|
|
|
argumentToString func(value any) (string, bool)
|
2020-02-16 10:25:21 +01:00
|
|
|
reservedWords map[string]bool
|
2024-02-10 14:03:31 +01:00
|
|
|
serializeOrderBy func(expression Expression, ascending, nullsFirst *bool) SerializerFunc
|
2024-10-17 14:12:21 +02:00
|
|
|
valuesDefaultColumnName func(index int) string
|
2025-03-08 19:01:37 +01:00
|
|
|
jsonValueEncode func(expr Expression) Expression
|
2026-02-02 13:21:35 +01:00
|
|
|
regexpLike func(str StringExpression, not bool, pattern StringExpression, caseSensitive bool) SerializerFunc
|
2019-08-03 14:10:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *dialectImpl) Name() string {
|
|
|
|
|
return d.name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *dialectImpl) PackageName() string {
|
|
|
|
|
return d.packageName
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-15 13:54:05 +02:00
|
|
|
func (d *dialectImpl) OperatorSerializeOverride(operator string) SerializeOverride {
|
|
|
|
|
if d.operatorSerializeOverrides == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return d.operatorSerializeOverrides[operator]
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-03 14:10:47 +02:00
|
|
|
func (d *dialectImpl) AliasQuoteChar() byte {
|
|
|
|
|
return d.aliasQuoteChar
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *dialectImpl) IdentifierQuoteChar() byte {
|
|
|
|
|
return d.identifierQuoteChar
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *dialectImpl) ArgumentPlaceholder() QueryPlaceholderFunc {
|
|
|
|
|
return d.argumentPlaceholder
|
|
|
|
|
}
|
2020-02-16 10:25:21 +01:00
|
|
|
|
2025-02-28 18:23:15 +01:00
|
|
|
func (d *dialectImpl) ArgumentToString(value any) (string, bool) {
|
|
|
|
|
return d.argumentToString(value)
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-16 10:25:21 +01:00
|
|
|
func (d *dialectImpl) IsReservedWord(name string) bool {
|
|
|
|
|
_, isReservedWord := d.reservedWords[strings.ToLower(name)]
|
|
|
|
|
return isReservedWord
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-10 14:03:31 +01:00
|
|
|
func (d *dialectImpl) SerializeOrderBy() func(expression Expression, ascending, nullsFirst *bool) SerializerFunc {
|
|
|
|
|
return d.serializeOrderBy
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-17 14:12:21 +02:00
|
|
|
func (d *dialectImpl) ValuesDefaultColumnName(index int) string {
|
|
|
|
|
return d.valuesDefaultColumnName(index)
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-08 19:01:37 +01:00
|
|
|
func (d *dialectImpl) JsonValueEncode(expr Expression) Expression {
|
|
|
|
|
return d.jsonValueEncode(expr)
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-02 13:21:35 +01:00
|
|
|
func (d *dialectImpl) RegexpLike(str StringExpression, not bool, pattern StringExpression, caseSensitive bool) SerializerFunc {
|
|
|
|
|
if d.regexpLike != nil {
|
|
|
|
|
return d.regexpLike(str, not, pattern, caseSensitive)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return func(statement StatementType, out *SQLBuilder, options ...SerializeOption) {
|
|
|
|
|
str.serialize(statement, out, FallTrough(options)...)
|
|
|
|
|
if not {
|
|
|
|
|
out.WriteString("NOT")
|
|
|
|
|
}
|
|
|
|
|
out.WriteString("REGEXP")
|
|
|
|
|
pattern.serialize(statement, out, FallTrough(options)...)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-16 10:25:21 +01:00
|
|
|
func arrayOfStringsToMapOfStrings(arr []string) map[string]bool {
|
|
|
|
|
ret := map[string]bool{}
|
|
|
|
|
for _, elem := range arr {
|
|
|
|
|
ret[strings.ToLower(elem)] = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
}
|