Merge pull request #192 from bcleenders/quickfix_repl_commands
Prevents repl panic, uses primary key generation for all writers
This commit is contained in:
commit
31d9078a64
5 changed files with 119 additions and 14 deletions
1
AUTHORS
1
AUTHORS
|
|
@ -9,6 +9,7 @@
|
||||||
# Please keep the list sorted.
|
# Please keep the list sorted.
|
||||||
|
|
||||||
Alexander Peters <info@alexanderpeters.de>
|
Alexander Peters <info@alexanderpeters.de>
|
||||||
|
Bram Leenders <bcleenders@gmail.com>
|
||||||
Google Inc.
|
Google Inc.
|
||||||
Jay Graves <jaywgraves@gmail.com>
|
Jay Graves <jaywgraves@gmail.com>
|
||||||
Jeremy Jay <jeremy@pbnjay.com>
|
Jeremy Jay <jeremy@pbnjay.com>
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
Alexander Peters <info@alexanderpeters.de>
|
Alexander Peters <info@alexanderpeters.de>
|
||||||
Barak Michener <barakmich@google.com> <barak@cayley.io> <me@barakmich.com>
|
Barak Michener <barakmich@google.com> <barak@cayley.io> <me@barakmich.com>
|
||||||
|
Bram Leenders <bcleenders@gmail.com>
|
||||||
Jay Graves <jaywgraves@gmail.com>
|
Jay Graves <jaywgraves@gmail.com>
|
||||||
Jeremy Jay <jeremy@pbnjay.com>
|
Jeremy Jay <jeremy@pbnjay.com>
|
||||||
Pius Uzamere <pius+github@alum.mit.edu>
|
Pius Uzamere <pius+github@alum.mit.edu>
|
||||||
|
|
|
||||||
53
db/repl.go
53
db/repl.go
|
|
@ -118,33 +118,38 @@ func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if code == "" {
|
if code == "" {
|
||||||
switch {
|
cmd, args := splitLine(line)
|
||||||
case strings.HasPrefix(line, ":debug"):
|
|
||||||
|
switch cmd {
|
||||||
|
case ":debug":
|
||||||
ses.ToggleDebug()
|
ses.ToggleDebug()
|
||||||
fmt.Println("Debug Toggled")
|
fmt.Println("Debug Toggled")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
case strings.HasPrefix(line, ":a"):
|
case ":a":
|
||||||
quad, err := cquads.Parse(line[3:])
|
quad, err := cquads.Parse(args)
|
||||||
if !quad.IsValid() {
|
if err != nil {
|
||||||
if err != nil {
|
fmt.Printf("Error: not a valid quad: %v\n", err)
|
||||||
fmt.Printf("not a valid quad: %v\n", err)
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
h.QuadWriter.AddQuad(quad)
|
h.QuadWriter.AddQuad(quad)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
case strings.HasPrefix(line, ":d"):
|
case ":d":
|
||||||
quad, err := cquads.Parse(line[3:])
|
quad, err := cquads.Parse(args)
|
||||||
if !quad.IsValid() {
|
if err != nil {
|
||||||
if err != nil {
|
fmt.Printf("Error: not a valid quad: %v\n", err)
|
||||||
fmt.Printf("not a valid quad: %v\n", err)
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
h.QuadWriter.RemoveQuad(quad)
|
h.QuadWriter.RemoveQuad(quad)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
default:
|
||||||
|
if cmd[0] == ':' {
|
||||||
|
fmt.Printf("Unknown command: %q\n", cmd)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -163,6 +168,26 @@ func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Splits a line into a command and its arguments
|
||||||
|
// e.g. ":a b c d ." will be split into ":a" and " b c d ."
|
||||||
|
func splitLine(line string) (string, string) {
|
||||||
|
var command, arguments string
|
||||||
|
|
||||||
|
line = strings.TrimSpace(line)
|
||||||
|
|
||||||
|
// An empty line/a line consisting of whitespace contains neither command nor arguments
|
||||||
|
if len(line) > 0 {
|
||||||
|
command = strings.Fields(line)[0]
|
||||||
|
|
||||||
|
// A line containing only a command has no arguments
|
||||||
|
if len(line) > len(command) {
|
||||||
|
arguments = line[len(command):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return command, arguments
|
||||||
|
}
|
||||||
|
|
||||||
func terminal(path string) (*liner.State, error) {
|
func terminal(path string) (*liner.State, error) {
|
||||||
term := liner.NewLiner()
|
term := liner.NewLiner()
|
||||||
|
|
||||||
|
|
|
||||||
66
db/repl_test.go
Normal file
66
db/repl_test.go
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
// 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 (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var testSplitLines = []struct {
|
||||||
|
line string
|
||||||
|
expectedCommand string
|
||||||
|
expectedArguments string
|
||||||
|
err error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
line: ":a arg1 arg2 arg3 .",
|
||||||
|
expectedCommand: ":a",
|
||||||
|
expectedArguments: " arg1 arg2 arg3 .",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
line: ":debug",
|
||||||
|
expectedCommand: ":debug",
|
||||||
|
// expectedArguments is nil
|
||||||
|
},
|
||||||
|
{
|
||||||
|
line: "",
|
||||||
|
// expectedCommand is nil
|
||||||
|
// expectedArguments is nil
|
||||||
|
},
|
||||||
|
{
|
||||||
|
line: `:d <http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> . # comments here`,
|
||||||
|
expectedCommand: ":d",
|
||||||
|
expectedArguments: ` <http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> . # comments here`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
line: ` :a subject "predicate with spaces" object . `,
|
||||||
|
expectedCommand: ":a",
|
||||||
|
expectedArguments: ` subject "predicate with spaces" object .`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSplitLines(t *testing.T) {
|
||||||
|
for _, testcase := range testSplitLines {
|
||||||
|
command, arguments := splitLine(testcase.line)
|
||||||
|
|
||||||
|
if testcase.expectedCommand != command {
|
||||||
|
t.Errorf("Error splitting lines: got: %v expected: %v", command, testcase.expectedCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
if testcase.expectedArguments != arguments {
|
||||||
|
t.Errorf("Error splitting lines: got: %v expected: %v", arguments, testcase.expectedArguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -50,6 +50,18 @@ Now it's loaded. We can use Cayley now to connect to the graph. As you might hav
|
||||||
|
|
||||||
Where you'll be given a `cayley>` prompt. It's expecting Gremlin/JS, but that can also be configured with a flag.
|
Where you'll be given a `cayley>` prompt. It's expecting Gremlin/JS, but that can also be configured with a flag.
|
||||||
|
|
||||||
|
New nodes and links can be added with the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cayley> :a object predicate subject label .
|
||||||
|
```
|
||||||
|
|
||||||
|
Removing links works similarly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cayley> :d object predicate subject .
|
||||||
|
```
|
||||||
|
|
||||||
This is great for testing, and ultimately also for scripting, but the real workhorse is the next step.
|
This is great for testing, and ultimately also for scripting, but the real workhorse is the next step.
|
||||||
|
|
||||||
### Serve Your Graph
|
### Serve Your Graph
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue