Skip to content

Commit

Permalink
Merge pull request #14 from walmartlabs/20170324-async-queries
Browse files Browse the repository at this point in the history
Refactoring of execution
  • Loading branch information
bcarrell committed Mar 28, 2017
2 parents 68f6474 + 0044669 commit 57cc01e
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 124 deletions.
87 changes: 82 additions & 5 deletions dev-resources/perf.clj
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,81 @@
[com.walmartlabs.lacinia.parser :as parser]
[clojure.java.shell :refer [sh]]
[clojure.string :as str]
[clojure.tools.cli :as cli])
[clojure.tools.cli :as cli]
[com.walmartlabs.lacinia.util :as util]
[com.walmartlabs.lacinia.schema :as schema]
[com.walmartlabs.lacinia.resolve :refer [resolve-as]])
(:import (java.util Date)))

;; Be aware that any change to this schema will invalidate any gathered
;; performance data.

(def compiled-schema (star-wars-schema))

;; A schema to measure the peformance of errors
(def planets-schema
(let [planet-data [{:name "Mercury"}
{:name "Venus"}
{:name "Earth"
:moons [{:name "Luna"
:bases [{:name "Alpha"}
{:name "Moon 1"}
{:name "月基地图"}]}]}
{:name "Mars"
:moons [{:name "Phobos"}
{:name "Deimos"}]}
{:name "Asteroid Belt"
:moons (for [i (range 1 101)]
{:name (str "Asteroid " i)
:bases [{:name "Pad"
:destroyed? true}]})}
{:name "Jupiter"
:moons [{:name "Europa"
:bases [{:name "Beta"
:alien? true}]}
{:name "Ganymede"}
{:name "Callisto"
:bases [{:name "Gamma"}]}]}
{:name "Saturn"
:moons [{:name "Dione"}
{:name "Tethys"}
{:name "Titan"
:bases [{:name "Omega"}]}]}
{:name "Saturn"}
{:name "Uranus"}]
resolvers {:base-name (fn [_ _ base]
(resolve-as (:name base)
(cond
(:alien? base)
{:message "Europa is forbidden. Attempt no landing there."}

(:destroyed? base)
{:message "This base has been destroyed."})))
:planets (fn [_ _ _]
planet-data)}]
(-> '{:objects
{:planet
{:fields
{:name {:type (non-null String)}
:moons {:type (list :moon)}}}

:moon
{:fields
{:name {:type (non-null String)}
:bases {:type (list :base)}}}

:base
{:fields
{:name {:type (non-null String)
:resolve :base-name}}}}

:queries
{:planets
{:type (list :planet)
:resolve :planets}}}
(util/attach-resolvers resolvers)
schema/compile)))

;; This is the standard introspection query that graphiql
;; executes to build the client-side UI.

Expand Down Expand Up @@ -97,6 +164,7 @@
(def ^:private benchmark-queries
{:introspection
{:query introspection-query-raw}

:basic
{:query "
{
Expand All @@ -111,6 +179,7 @@
name
friends { name }}
}"}

:basic-vars
{:query "
query ($ep : episode!) {
Expand All @@ -126,7 +195,13 @@
friends { name }
}
}"
:vars {:ep "NEWHOPE"}}})
:vars {:ep "NEWHOPE"}}

:errors
;; Test how long it take when a single deeply nested resolver resolves an error.
;; Also shows the cost of the call to distinct
{:query "{ planets { name moons { name bases { name }}}}"
:schema planets-schema}})

(defmacro ^:private benchmark [expr]
`(-> ~expr
Expand All @@ -144,9 +219,11 @@
(println "Running benchmark" (name benchmark-name) "(parse) ...")

(let [{query-string :query
variables :vars} (get benchmark-queries benchmark-name)
parse-time (benchmark (parser/parse-query compiled-schema query-string))
parsed-query (parser/parse-query compiled-schema query-string)
variables :vars
schema :schema
:or {schema compiled-schema}} (get benchmark-queries benchmark-name)
parse-time (benchmark (parser/parse-query schema query-string))
parsed-query (parser/parse-query schema query-string)
_ (println "Running benchmark" (name benchmark-name) "(exec) ...")
exec-time (benchmark (execute-parsed-query parsed-query variables nil))]
[(name benchmark-name) parse-time exec-time]))
Expand Down
4 changes: 4 additions & 0 deletions perf/benchmarks.csv
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,7 @@ date,commit,kind,parse,exec
20170324,1b7f456c,introspection,2.0246591950333332,3.4602085544289043
20170324,1b7f456c,basic,0.5015100832206664,0.24973527992753625
20170324,1b7f456c,basic-vars,0.6428995111702128,0.25122130674037674
20170324,cae8f794,introspection,2.0250440356182797,3.178506137552083
20170324,cae8f794,basic,0.4980364009556764,0.24132741184534814
20170324,cae8f794,basic-vars,0.6358850933709745,0.24591709582839535
20170324,cae8f794,errors,0.23813962460006155,6.3390120183333325

0 comments on commit 57cc01e

Please sign in to comment.