From 3048929de4eef9d62afd003fe941574db6cf9567 Mon Sep 17 00:00:00 2001
From: Manish R Jain <manishrjain@gmail.com>
Date: Tue, 3 May 2016 10:11:51 +1000
Subject: [PATCH] Correctly parse argument first

---
 gql/parser.go      | 29 ++++++++++++-----------------
 gql/parser_test.go | 33 ++++++++++++++++++++++++++++-----
 2 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/gql/parser.go b/gql/parser.go
index 2f7cc111..bc633881 100644
--- a/gql/parser.go
+++ b/gql/parser.go
@@ -238,24 +238,19 @@ func godeep(l *lex.Lexer, gq *GraphQuery) error {
 			return nil
 
 		} else if item.Typ == itemLeftRound {
-			// absorb all these, we don't use them right now.
-			/*
-				for {
-					var key, val string
-					item = <-l.Items
-					if item.Typ == itemArgName {
-						key = item.Val
-					} else if item.Typ == itemRightRound {
-						break
-					} else {
-						return nil, fmt.Errorf("Expecting argument name. Got: %v", item)
+
+			args, err := parseArguments(l)
+			if err != nil {
+				return err
+			}
+			// We only use argument 'first' for now.
+			for _, p := range args {
+				if p.Key == "first" {
+					count, err := strconv.ParseInt(p.Val, 0, 32)
+					if err != nil {
+						return err
 					}
-				}
-			*/
-			for ti := range l.Items {
-				fmt.Println(ti.String())
-				if ti.Typ == itemRightRound || ti.Typ == lex.ItemEOF {
-					return nil
+					curp.First = int(count)
 				}
 			}
 		}
diff --git a/gql/parser_test.go b/gql/parser_test.go
index fb5d1c81..e9bea443 100644
--- a/gql/parser_test.go
+++ b/gql/parser_test.go
@@ -101,9 +101,7 @@ func TestParseXid(t *testing.T) {
 	}
 }
 
-/*
 func TestParseFirst(t *testing.T) {
-	// logrus.SetLevel(logrus.DebugLevel)
 	query := `
 	query {
 		user(_xid_: m.abcd) {
@@ -121,14 +119,39 @@ func TestParseFirst(t *testing.T) {
 		t.Error("subgraph is nil")
 		return
 	}
-	if len(gq.Children) != 1 {
-		t.Errorf("Expected 1 children. Got: %v", len(gq.Children))
+	if len(gq.Children) != 2 {
+		t.Errorf("Expected 2 children. Got: %v", len(gq.Children))
 	}
 	if err := checkAttr(gq.Children[0], "type.object.name"); err != nil {
 		t.Error(err)
 	}
+	if gq.Children[0].First != 0 {
+		t.Errorf("Expected count 0. Got: %v", gq.Children[0].First)
+	}
+	if err := checkAttr(gq.Children[1], "friends"); err != nil {
+		t.Error(err)
+	}
+	if gq.Children[1].First != 10 {
+		t.Errorf("Expected count 10. Got: %v", gq.Children[1].First)
+	}
+}
+
+func TestParseFirst_error(t *testing.T) {
+	query := `
+	query {
+		user(_xid_: m.abcd) {
+			type.object.name
+			friends (first: ) {
+			}
+		}
+	}`
+	var err error
+	_, _, err = Parse(query)
+	t.Log(err)
+	if err == nil {
+		t.Error("Expected error")
+	}
 }
-*/
 
 func TestParse_error2(t *testing.T) {
 	query := `
-- 
GitLab