From 639559544d5e68f9b44017f5925d67248feb8e16 Mon Sep 17 00:00:00 2001 From: kortschak Date: Sat, 28 Jun 2014 02:14:09 +0930 Subject: [PATCH] Reorganise to make cmd code more prominant --- cayley.go | 89 +++++++++++++++++++++++++++++++++ cmd/cayley/main.go | 89 --------------------------------- db/init.go | 40 +++++++++++++++ db/load.go | 81 ++++++++++++++++++++++++++++++ db/open.go | 40 +++++++++++++++ db/repl.go | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++ init.go | 40 --------------- load.go | 81 ------------------------------ open.go | 40 --------------- repl.go | 143 ----------------------------------------------------- 10 files changed, 393 insertions(+), 393 deletions(-) create mode 100644 cayley.go delete mode 100644 cmd/cayley/main.go create mode 100644 db/init.go create mode 100644 db/load.go create mode 100644 db/open.go create mode 100644 db/repl.go delete mode 100644 init.go delete mode 100644 load.go delete mode 100644 open.go delete mode 100644 repl.go diff --git a/cayley.go b/cayley.go new file mode 100644 index 0000000..06af4f2 --- /dev/null +++ b/cayley.go @@ -0,0 +1,89 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "flag" + "fmt" + "os" + "runtime" + + "github.com/barakmich/glog" + + "github.com/google/cayley/config" + "github.com/google/cayley/db" + "github.com/google/cayley/graph" + "github.com/google/cayley/http" +) + +var tripleFile = flag.String("triples", "", "Triple File to load before going to REPL.") +var cpuprofile = flag.String("prof", "", "Output profiling file.") +var queryLanguage = flag.String("query_lang", "gremlin", "Use this parser as the query language.") +var configFile = flag.String("config", "", "Path to an explicit configuration file.") + +func Usage() { + fmt.Println("Cayley is a graph store and graph query layer.\n") + fmt.Println("Usage:") + fmt.Println(" cayley COMMAND [flags]\n") + fmt.Println("Commands:") + fmt.Println(" init\tCreate an empty database.") + fmt.Println(" load\tBulk-load a triple file into the database.") + fmt.Println(" http\tServe an HTTP endpoint on the given host and port.") + fmt.Println(" repl\tDrop into a REPL of the given query language.") + fmt.Println("\nFlags:") + flag.Parse() + flag.PrintDefaults() +} + +func main() { + // No command? It's time for usage. + if len(os.Args) == 1 { + Usage() + os.Exit(1) + } + cmd := os.Args[1] + newargs := make([]string, 0) + newargs = append(newargs, os.Args[0]) + newargs = append(newargs, os.Args[2:]...) + os.Args = newargs + flag.Parse() + var ts graph.TripleStore + cfg := config.ParseConfigFromFlagsAndFile(*configFile) + if os.Getenv("GOMAXPROCS") == "" { + runtime.GOMAXPROCS(runtime.NumCPU()) + glog.Infoln("Setting GOMAXPROCS to", runtime.NumCPU()) + } else { + glog.Infoln("GOMAXPROCS currently", os.Getenv("GOMAXPROCS"), " -- not adjusting") + } + switch cmd { + case "init": + db.CayleyInit(cfg, *tripleFile) + case "load": + ts = db.OpenTSFromConfig(cfg) + db.CayleyLoad(ts, cfg, *tripleFile, false) + ts.Close() + case "repl": + ts = db.OpenTSFromConfig(cfg) + db.CayleyRepl(ts, *queryLanguage, cfg) + ts.Close() + case "http": + ts = db.OpenTSFromConfig(cfg) + http.CayleyHTTP(ts, cfg) + ts.Close() + default: + fmt.Println("No command", cmd) + flag.Usage() + } +} diff --git a/cmd/cayley/main.go b/cmd/cayley/main.go deleted file mode 100644 index 153cf76..0000000 --- a/cmd/cayley/main.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "flag" - "fmt" - "os" - "runtime" - - "github.com/barakmich/glog" - - "github.com/google/cayley" - "github.com/google/cayley/config" - "github.com/google/cayley/graph" - "github.com/google/cayley/http" -) - -var tripleFile = flag.String("triples", "", "Triple File to load before going to REPL.") -var cpuprofile = flag.String("prof", "", "Output profiling file.") -var queryLanguage = flag.String("query_lang", "gremlin", "Use this parser as the query language.") -var configFile = flag.String("config", "", "Path to an explicit configuration file.") - -func Usage() { - fmt.Println("Cayley is a graph store and graph query layer.\n") - fmt.Println("Usage:") - fmt.Println(" cayley COMMAND [flags]\n") - fmt.Println("Commands:") - fmt.Println(" init\tCreate an empty database.") - fmt.Println(" load\tBulk-load a triple file into the database.") - fmt.Println(" http\tServe an HTTP endpoint on the given host and port.") - fmt.Println(" repl\tDrop into a REPL of the given query language.") - fmt.Println("\nFlags:") - flag.Parse() - flag.PrintDefaults() -} - -func main() { - // No command? It's time for usage. - if len(os.Args) == 1 { - Usage() - os.Exit(1) - } - cmd := os.Args[1] - newargs := make([]string, 0) - newargs = append(newargs, os.Args[0]) - newargs = append(newargs, os.Args[2:]...) - os.Args = newargs - flag.Parse() - var ts graph.TripleStore - cfg := config.ParseConfigFromFlagsAndFile(*configFile) - if os.Getenv("GOMAXPROCS") == "" { - runtime.GOMAXPROCS(runtime.NumCPU()) - glog.Infoln("Setting GOMAXPROCS to", runtime.NumCPU()) - } else { - glog.Infoln("GOMAXPROCS currently", os.Getenv("GOMAXPROCS"), " -- not adjusting") - } - switch cmd { - case "init": - cayley.CayleyInit(cfg, *tripleFile) - case "load": - ts = cayley.OpenTSFromConfig(cfg) - cayley.CayleyLoad(ts, cfg, *tripleFile, false) - ts.Close() - case "repl": - ts = cayley.OpenTSFromConfig(cfg) - cayley.CayleyRepl(ts, *queryLanguage, cfg) - ts.Close() - case "http": - ts = cayley.OpenTSFromConfig(cfg) - http.CayleyHTTP(ts, cfg) - ts.Close() - default: - fmt.Println("No command", cmd) - flag.Usage() - } -} diff --git a/db/init.go b/db/init.go new file mode 100644 index 0000000..d3ab8a8 --- /dev/null +++ b/db/init.go @@ -0,0 +1,40 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "github.com/google/cayley/config" + "github.com/google/cayley/graph/leveldb" + "github.com/google/cayley/graph/mongo" +) + +func CayleyInit(cfg *config.CayleyConfig, triplePath string) bool { + created := false + dbpath := cfg.DatabasePath + switch cfg.DatabaseType { + case "mongo", "mongodb": + created = mongo.CreateNewMongoGraph(dbpath, cfg.DatabaseOptions) + case "leveldb": + created = leveldb.CreateNewLevelDB(dbpath) + case "mem": + return true + } + if created && triplePath != "" { + ts := OpenTSFromConfig(cfg) + CayleyLoad(ts, cfg, triplePath, true) + ts.Close() + } + return created +} diff --git a/db/load.go b/db/load.go new file mode 100644 index 0000000..ff232a0 --- /dev/null +++ b/db/load.go @@ -0,0 +1,81 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "os" + + "github.com/barakmich/glog" + + "github.com/google/cayley/config" + "github.com/google/cayley/graph" + "github.com/google/cayley/graph/mongo" + "github.com/google/cayley/nquads" +) + +func CayleyLoad(ts graph.TripleStore, cfg *config.CayleyConfig, triplePath string, firstTime bool) { + switch cfg.DatabaseType { + case "mongo", "mongodb": + if firstTime { + loadMongo(ts.(*mongo.MongoTripleStore), triplePath) + } else { + LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) + } + case "rethink", "rethinkdb": + LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) + case "leveldb": + LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) + case "mem": + LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) + } + +} + +func loadMongo(ts *mongo.MongoTripleStore, path string) { + tChan := make(chan *graph.Triple) + go ReadTriplesFromFile(tChan, path) + ts.BulkLoad(tChan) +} + +func ReadTriplesFromFile(c chan *graph.Triple, tripleFile string) { + f, err := os.Open(tripleFile) + if err != nil { + glog.Fatalln("Couldn't open file", tripleFile) + } + + defer func() { + if err := f.Close(); err != nil { + glog.Fatalln(err) + } + }() + + nquads.ReadNQuadsFromReader(c, f) +} + +func LoadTriplesFromFileInto(ts graph.TripleStore, filename string, loadSize int) { + tChan := make(chan *graph.Triple) + go ReadTriplesFromFile(tChan, filename) + tripleblock := make([]*graph.Triple, loadSize) + i := 0 + for t := range tChan { + tripleblock[i] = t + i++ + if i == loadSize { + ts.AddTripleSet(tripleblock) + i = 0 + } + } + ts.AddTripleSet(tripleblock[0:i]) +} diff --git a/db/open.go b/db/open.go new file mode 100644 index 0000000..7095739 --- /dev/null +++ b/db/open.go @@ -0,0 +1,40 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "github.com/barakmich/glog" + + "github.com/google/cayley/config" + "github.com/google/cayley/graph" + "github.com/google/cayley/graph/leveldb" + "github.com/google/cayley/graph/memstore" + "github.com/google/cayley/graph/mongo" +) + +func OpenTSFromConfig(cfg *config.CayleyConfig) graph.TripleStore { + glog.Infof("Opening database \"%s\" at %s", cfg.DatabaseType, cfg.DatabasePath) + switch cfg.DatabaseType { + case "mongo", "mongodb": + return mongo.NewMongoTripleStore(cfg.DatabasePath, cfg.DatabaseOptions) + case "leveldb": + return leveldb.NewDefaultLevelDBTripleStore(cfg.DatabasePath, cfg.DatabaseOptions) + case "mem": + ts := memstore.NewMemTripleStore() + CayleyLoad(ts, cfg, cfg.DatabasePath, true) + return ts + } + panic("Unsupported database backend " + cfg.DatabaseType) +} diff --git a/db/repl.go b/db/repl.go new file mode 100644 index 0000000..405d61e --- /dev/null +++ b/db/repl.go @@ -0,0 +1,143 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "bufio" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/google/cayley/config" + "github.com/google/cayley/graph" + "github.com/google/cayley/graph/sexp" + "github.com/google/cayley/nquads" + "github.com/google/cayley/query/gremlin" + "github.com/google/cayley/query/mql" +) + +func trace(s string) (string, time.Time) { + return s, time.Now() +} + +func un(s string, startTime time.Time) { + endTime := time.Now() + + fmt.Printf(s, float64(endTime.UnixNano()-startTime.UnixNano())/float64(1E6)) +} + +func RunQuery(query string, ses graph.Session) { + nResults := 0 + startTrace, startTime := trace("Elapsed time: %g ms\n\n") + defer func() { + if nResults > 0 { + un(startTrace, startTime) + } + }() + fmt.Printf("\n") + c := make(chan interface{}, 5) + go ses.ExecInput(query, c, 100) + for res := range c { + fmt.Print(ses.ToText(res)) + nResults++ + } + if nResults > 0 { + fmt.Printf("-----------\n%d Results\n", nResults) + } +} + +func CayleyRepl(ts graph.TripleStore, queryLanguage string, cfg *config.CayleyConfig) { + var ses graph.Session + switch queryLanguage { + case "sexp": + ses = sexp.NewSexpSession(ts) + case "mql": + ses = mql.NewMqlSession(ts) + case "gremlin": + fallthrough + default: + ses = gremlin.NewGremlinSession(ts, cfg.GremlinTimeout, true) + } + inputBf := bufio.NewReader(os.Stdin) + line := "" + for { + if line == "" { + fmt.Print("cayley> ") + } else { + fmt.Print("... ") + } + l, pre, err := inputBf.ReadLine() + if err == io.EOF { + if line != "" { + line = "" + } else { + break + } + } + if err != nil { + line = "" + } + if pre { + panic("Line too long") + } + line += string(l) + if line == "" { + continue + } + if strings.HasPrefix(line, ":debug") { + ses.ToggleDebug() + fmt.Println("Debug Toggled") + line = "" + continue + } + if strings.HasPrefix(line, ":a") { + var tripleStmt = line[3:] + triple := nquads.ParseLineToTriple(tripleStmt) + if triple == nil { + fmt.Println("Not a valid triple.") + line = "" + continue + } + ts.AddTriple(triple) + line = "" + continue + } + if strings.HasPrefix(line, ":d") { + var tripleStmt = line[3:] + triple := nquads.ParseLineToTriple(tripleStmt) + if triple == nil { + fmt.Println("Not a valid triple.") + line = "" + continue + } + ts.RemoveTriple(triple) + line = "" + continue + } + result, err := ses.InputParses(line) + switch result { + case graph.Parsed: + RunQuery(line, ses) + line = "" + case graph.ParseFail: + fmt.Println("Error: ", err) + line = "" + case graph.ParseMore: + default: + } + } +} diff --git a/init.go b/init.go deleted file mode 100644 index 5e60b3a..0000000 --- a/init.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cayley - -import ( - "github.com/google/cayley/config" - "github.com/google/cayley/graph/leveldb" - "github.com/google/cayley/graph/mongo" -) - -func CayleyInit(cfg *config.CayleyConfig, triplePath string) bool { - created := false - dbpath := cfg.DatabasePath - switch cfg.DatabaseType { - case "mongo", "mongodb": - created = mongo.CreateNewMongoGraph(dbpath, cfg.DatabaseOptions) - case "leveldb": - created = leveldb.CreateNewLevelDB(dbpath) - case "mem": - return true - } - if created && triplePath != "" { - ts := OpenTSFromConfig(cfg) - CayleyLoad(ts, cfg, triplePath, true) - ts.Close() - } - return created -} diff --git a/load.go b/load.go deleted file mode 100644 index 8dc9d59..0000000 --- a/load.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cayley - -import ( - "os" - - "github.com/barakmich/glog" - - "github.com/google/cayley/config" - "github.com/google/cayley/graph" - "github.com/google/cayley/graph/mongo" - "github.com/google/cayley/nquads" -) - -func CayleyLoad(ts graph.TripleStore, cfg *config.CayleyConfig, triplePath string, firstTime bool) { - switch cfg.DatabaseType { - case "mongo", "mongodb": - if firstTime { - loadMongo(ts.(*mongo.MongoTripleStore), triplePath) - } else { - LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) - } - case "rethink", "rethinkdb": - LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) - case "leveldb": - LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) - case "mem": - LoadTriplesFromFileInto(ts, triplePath, cfg.LoadSize) - } - -} - -func loadMongo(ts *mongo.MongoTripleStore, path string) { - tChan := make(chan *graph.Triple) - go ReadTriplesFromFile(tChan, path) - ts.BulkLoad(tChan) -} - -func ReadTriplesFromFile(c chan *graph.Triple, tripleFile string) { - f, err := os.Open(tripleFile) - if err != nil { - glog.Fatalln("Couldn't open file", tripleFile) - } - - defer func() { - if err := f.Close(); err != nil { - glog.Fatalln(err) - } - }() - - nquads.ReadNQuadsFromReader(c, f) -} - -func LoadTriplesFromFileInto(ts graph.TripleStore, filename string, loadSize int) { - tChan := make(chan *graph.Triple) - go ReadTriplesFromFile(tChan, filename) - tripleblock := make([]*graph.Triple, loadSize) - i := 0 - for t := range tChan { - tripleblock[i] = t - i++ - if i == loadSize { - ts.AddTripleSet(tripleblock) - i = 0 - } - } - ts.AddTripleSet(tripleblock[0:i]) -} diff --git a/open.go b/open.go deleted file mode 100644 index 0c82acd..0000000 --- a/open.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cayley - -import ( - "github.com/barakmich/glog" - - "github.com/google/cayley/config" - "github.com/google/cayley/graph" - "github.com/google/cayley/graph/leveldb" - "github.com/google/cayley/graph/memstore" - "github.com/google/cayley/graph/mongo" -) - -func OpenTSFromConfig(cfg *config.CayleyConfig) graph.TripleStore { - glog.Infof("Opening database \"%s\" at %s", cfg.DatabaseType, cfg.DatabasePath) - switch cfg.DatabaseType { - case "mongo", "mongodb": - return mongo.NewMongoTripleStore(cfg.DatabasePath, cfg.DatabaseOptions) - case "leveldb": - return leveldb.NewDefaultLevelDBTripleStore(cfg.DatabasePath, cfg.DatabaseOptions) - case "mem": - ts := memstore.NewMemTripleStore() - CayleyLoad(ts, cfg, cfg.DatabasePath, true) - return ts - } - panic("Unsupported database backend " + cfg.DatabaseType) -} diff --git a/repl.go b/repl.go deleted file mode 100644 index 62f3e5e..0000000 --- a/repl.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cayley - -import ( - "bufio" - "fmt" - "io" - "os" - "strings" - "time" - - "github.com/google/cayley/config" - "github.com/google/cayley/graph" - "github.com/google/cayley/graph/sexp" - "github.com/google/cayley/nquads" - "github.com/google/cayley/query/gremlin" - "github.com/google/cayley/query/mql" -) - -func trace(s string) (string, time.Time) { - return s, time.Now() -} - -func un(s string, startTime time.Time) { - endTime := time.Now() - - fmt.Printf(s, float64(endTime.UnixNano()-startTime.UnixNano())/float64(1E6)) -} - -func RunQuery(query string, ses graph.Session) { - nResults := 0 - startTrace, startTime := trace("Elapsed time: %g ms\n\n") - defer func() { - if nResults > 0 { - un(startTrace, startTime) - } - }() - fmt.Printf("\n") - c := make(chan interface{}, 5) - go ses.ExecInput(query, c, 100) - for res := range c { - fmt.Print(ses.ToText(res)) - nResults++ - } - if nResults > 0 { - fmt.Printf("-----------\n%d Results\n", nResults) - } -} - -func CayleyRepl(ts graph.TripleStore, queryLanguage string, cfg *config.CayleyConfig) { - var ses graph.Session - switch queryLanguage { - case "sexp": - ses = sexp.NewSexpSession(ts) - case "mql": - ses = mql.NewMqlSession(ts) - case "gremlin": - fallthrough - default: - ses = gremlin.NewGremlinSession(ts, cfg.GremlinTimeout, true) - } - inputBf := bufio.NewReader(os.Stdin) - line := "" - for { - if line == "" { - fmt.Print("cayley> ") - } else { - fmt.Print("... ") - } - l, pre, err := inputBf.ReadLine() - if err == io.EOF { - if line != "" { - line = "" - } else { - break - } - } - if err != nil { - line = "" - } - if pre { - panic("Line too long") - } - line += string(l) - if line == "" { - continue - } - if strings.HasPrefix(line, ":debug") { - ses.ToggleDebug() - fmt.Println("Debug Toggled") - line = "" - continue - } - if strings.HasPrefix(line, ":a") { - var tripleStmt = line[3:] - triple := nquads.ParseLineToTriple(tripleStmt) - if triple == nil { - fmt.Println("Not a valid triple.") - line = "" - continue - } - ts.AddTriple(triple) - line = "" - continue - } - if strings.HasPrefix(line, ":d") { - var tripleStmt = line[3:] - triple := nquads.ParseLineToTriple(tripleStmt) - if triple == nil { - fmt.Println("Not a valid triple.") - line = "" - continue - } - ts.RemoveTriple(triple) - line = "" - continue - } - result, err := ses.InputParses(line) - switch result { - case graph.Parsed: - RunQuery(line, ses) - line = "" - case graph.ParseFail: - fmt.Println("Error: ", err) - line = "" - case graph.ParseMore: - default: - } - } -}