Changed package name from github.com/lmika/audax to github.com/lmika/dynamo-browse
114 lines
2.9 KiB
Go
114 lines
2.9 KiB
Go
package queryexpr
|
|
|
|
import (
|
|
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
const (
|
|
valuePlaceholderPrefix = '$'
|
|
namePlaceholderPrefix = ':'
|
|
)
|
|
|
|
func (p *astPlaceholder) evalToIR(ctx *evalContext, info *models.TableInfo) (irAtom, error) {
|
|
placeholderType := p.Placeholder[0]
|
|
placeholder := p.Placeholder[1:]
|
|
|
|
if placeholderType == valuePlaceholderPrefix {
|
|
val, hasVal := ctx.lookupValue(placeholder)
|
|
if !hasVal {
|
|
return nil, MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
|
|
ev, err := newExprValueFromAttributeValue(val)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return irValue{value: ev}, nil
|
|
} else if placeholderType == namePlaceholderPrefix {
|
|
name, hasName := ctx.lookupName(placeholder)
|
|
if !hasName {
|
|
return nil, MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
|
|
return irNamePath{name, nil}, nil
|
|
}
|
|
|
|
return nil, errors.New("unrecognised placeholder")
|
|
}
|
|
|
|
func (p *astPlaceholder) evalItem(ctx *evalContext, item models.Item) (exprValue, error) {
|
|
placeholderType := p.Placeholder[0]
|
|
placeholder := p.Placeholder[1:]
|
|
|
|
if placeholderType == valuePlaceholderPrefix {
|
|
val, hasVal := ctx.lookupValue(placeholder)
|
|
if !hasVal {
|
|
return nil, MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
return newExprValueFromAttributeValue(val)
|
|
} else if placeholderType == namePlaceholderPrefix {
|
|
name, hasName := ctx.lookupName(placeholder)
|
|
if !hasName {
|
|
return nil, MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
|
|
res, hasV := item[name]
|
|
if !hasV {
|
|
return nil, nil
|
|
}
|
|
|
|
return newExprValueFromAttributeValue(res)
|
|
}
|
|
|
|
return nil, errors.New("unrecognised placeholder")
|
|
}
|
|
|
|
func (p *astPlaceholder) canModifyItem(ctx *evalContext, item models.Item) bool {
|
|
placeholderType := p.Placeholder[0]
|
|
return placeholderType == namePlaceholderPrefix
|
|
}
|
|
|
|
func (p *astPlaceholder) setEvalItem(ctx *evalContext, item models.Item, value exprValue) error {
|
|
placeholderType := p.Placeholder[0]
|
|
placeholder := p.Placeholder[1:]
|
|
|
|
if placeholderType == valuePlaceholderPrefix {
|
|
return PathNotSettableError{}
|
|
} else if placeholderType == namePlaceholderPrefix {
|
|
name, hasName := ctx.lookupName(placeholder)
|
|
if !hasName {
|
|
return MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
|
|
item[name] = value.asAttributeValue()
|
|
return nil
|
|
}
|
|
|
|
return errors.New("unrecognised placeholder")
|
|
}
|
|
|
|
func (p *astPlaceholder) deleteAttribute(ctx *evalContext, item models.Item) error {
|
|
placeholderType := p.Placeholder[0]
|
|
placeholder := p.Placeholder[1:]
|
|
|
|
if placeholderType == valuePlaceholderPrefix {
|
|
return PathNotSettableError{}
|
|
} else if placeholderType == namePlaceholderPrefix {
|
|
name, hasName := ctx.lookupName(placeholder)
|
|
if !hasName {
|
|
return MissingPlaceholderError{Placeholder: p.Placeholder}
|
|
}
|
|
|
|
delete(item, name)
|
|
return nil
|
|
}
|
|
|
|
return errors.New("unrecognised placeholder")
|
|
}
|
|
|
|
func (p *astPlaceholder) String() string {
|
|
return p.Placeholder
|
|
}
|