Skip to content

Commit

Permalink
covered AS keyword
Browse files Browse the repository at this point in the history
  • Loading branch information
fenos committed May 5, 2021
1 parent 6663210 commit 33986bc
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 12 deletions.
6 changes: 6 additions & 0 deletions expression.go
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,12 @@ func Count(predicate string) RawExpression {
return Expr(string(countFunc) + "(" + EscapePredicate(predicate) + ")")
}

// P represent a predicate expression
// Expression: <predicate>
func P(predicate string) RawExpression {
return Expr(EscapePredicate(predicate))
}

type between struct {
predicate string
from interface{}
Expand Down
16 changes: 8 additions & 8 deletions predicate.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,14 +249,6 @@ func escapeSpecialChars(predicate string) string {
func parsePredicate(predicateName string) (predicate string, alias string, directive string) {
predicate = strings.TrimSpace(predicateName)

// Alias
aliasParts := strings.Split(predicateName, ":")

if len(aliasParts) > 1 {
alias = strings.TrimSpace(aliasParts[0])
predicateName = strings.Join(aliasParts[1:], "")
}

// Directive
predicateParts := strings.Split(predicateName, "@")

Expand All @@ -265,6 +257,14 @@ func parsePredicate(predicateName string) (predicate string, alias string, direc
directive = "@" + strings.Join(predicateParts[1:], "")
}

// Alias
aliasParts := strings.Split(predicateName, ":")

if len(aliasParts) > 1 {
alias = strings.TrimSpace(aliasParts[0])
predicateName = strings.Join(aliasParts[1:], "")
}

return predicateName, alias, directive
}

Expand Down
2 changes: 1 addition & 1 deletion query_operation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func Test_Multiple_Blocks(t *testing.T) {
query Bladerunner_Bladerunner2($0:string, $1:string, $2:string, $3:string) {
<bladerunner>(func: eq(<item>,$0)) @filter(eq(<field1>,$1)) {
<uid>
<super_alias:name>
<super_alias>:<name>
<initial_release_date>
d AS <netflix_id>
}
Expand Down
42 changes: 39 additions & 3 deletions selection.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (fields nodeAttributes) ToDQL() (query string, args []interface{}, err erro
args = append(args, computedArgs)
selectedFields = append(selectedFields, computedDql)
case string:
fieldString := parseFields(requestField)
fieldString := parsePredicates(requestField)
selectedFields = append(selectedFields, fieldString...)
default:
return "", nil, fmt.Errorf("nodeAttributes can only accept strings or Dqlizer, given %v", requestField)
Expand Down Expand Up @@ -129,9 +129,45 @@ func (aliasField aliasField) ToDQL() (query string, args []interface{}, err erro
return fmt.Sprintf("%s:%s", aliasName, value), args, nil
}

func parseFields(fields string) []string {
type as struct {
variable string
predicate interface{}
}

// As makes a field a variable
// Example: dqlx.Query(...).Select(dqlx.As("C", "a"))
func As(varName string, predicate interface{}) DQLizer {
return as{
variable: varName,
predicate: predicate,
}
}

// ToDQL returns the dql statement for a field variable
func (as as) ToDQL() (query string, args []interface{}, err error) {
var predicate string

switch cast := as.predicate.(type) {
case DQLizer:
predicate, args, err = cast.ToDQL()

if err != nil {
return "", nil, err
}
case string:
predicate = EscapePredicate(cast)
default:
return "", nil, fmt.Errorf("alias only accepts string or DQlizers, given %v", predicate)
}

varName := escapeSpecialChars(as.variable)

return fmt.Sprintf("%s AS %s", varName, predicate), args, nil
}

func parsePredicates(predicates string) []string {
var parsedFields []string
fieldsParts := strings.Split(fields, "\n")
fieldsParts := strings.Split(predicates, "\n")

for _, fieldPart := range fieldsParts {
if strings.TrimSpace(fieldPart) == "" {
Expand Down

0 comments on commit 33986bc

Please sign in to comment.