2

CommandProviderコマンドを実装するカスタムを作成しました( cphr):

public void _cphr(CommandInterpreter ci){
/* ... *
}

これは、指定されたクエリをサイファー実行エンジンに転送するだけです。したがって、呼び出しの例:

osgi>cphr <query>

次のようにエンジンに渡されます。

ExecutionEngine eng = new ExecutionEngine(...);
ExecutionResult er = eng.execute(query);

CommandProvider-Interface はトークンベースのアクセス用に最適化されているため、その実装では をトークンに分割し、それqueryを反復処理できci.nextArgument()ます。

たとえば、一重引用符は取り除かれ、保持するには明示的にエスケープする必要があるため、これは問題があります。したがって、有効なクエリは次のとおりです。

cphr start n=node(*) where n.pathTime='2013-11-05-10-36-7' return n

構文エラーになります。

Invalid input '5': expected '.', whitespace, '[', node labels, "=~", IN, IS, '*', '/', '%', '^', '+', '-', '<', '>', "<=", ">=", '=', "<>", "!=", AND, XOR, OR, START, MATCH, MERGE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, RETURN, UNION, ';' or end of input (line 1, column 44) " start n=node(*) where n.pathTime=2013-11-05-10-36-7 return n"

一方、エスケープされたクエリは機能します。

cphr start n=node(*) where n.pathTime=\'2013-11-05-10-36-7\' return n

CommandProviderユーザーが実装で提供したコマンドラインにアクセスする方法はありますか?

4

1 に答える 1

1

残念ながら、 からすべての引数を (一度に) 取得する方法はありませんCommandInterpreter。しかし、それでも私は別の道を行くでしょう。

コマンドにクエリを提供しています。このクエリは、コマンドの 1 つの (!) 引数です。だから私は2つのことをします:

  1. コマンドの実装 (ここでは_cphr) では、引数が 1 つしかないことを強制します。
  2. 引数 (クエリ) にスペースが含まれている場合 (通常は含まれています)、この引数自体を引用符で囲む必要があります。> cphr "start n=node(*) where n.pathTime='2013-11-05-10-36-7' return n"
于 2013-11-05T12:48:04.377 に答える