Coder Social home page Coder Social logo

chana's Introduction

ChaNa

Avro Data Store based on Akka (persistence in progressing)

This project is named from Chinese word "刹那", which is a transliteration of the word "Kasna" from Sanskrit, means "instant; split second".

chana build status

Core Design

  • Each record is an actor (non-blocking)
  • Akka sharding cluster (easy to scale-out)
  • Locate field/value via XPath (since version 0.2.0)
  • Scripting triggered by field updating events (JDK 8 JavaScript engine - Nashorn)
  • JPQL query on cluster

Run chana

$ sbt run

Or

$ sbt clean compile dist
$ ls target/universal/
chana-0.2.0-SNAPSHOT.zip

Then, copy chana-0.2.0-SNAPSHOT.zip to somewhere and unzip it

$ cd chana-0.2.0-SNAPSHOT/bin
$ ./chana

Access chana

Example 1: Simple Record

Schema: PersonInfo.avsc

{
  "type" : "record",
  "name" : "PersonInfo",
  "namespace" : "chana",
  "fields" : [ {
    "name" : "name",
    "type" : "string"
  }, {
    "name" : "age",
    "type" : "int"
  }, {
    "name" : "gender",
    "type" : {
      "type" : "enum",
      "name" : "GenderType",
      "symbols" : [ "Female", "Male", "Unknown" ]
    },
    "default" : "Unknown"
  }, {
    "name" : "emails",
    "type" : {
      "type" : "array",
      "items" : "string"
    }
  } ]
}

Try it:

$ cd src/test/resources/avsc

$ curl --data @PersonInfo.avsc 'http://127.0.0.1:8080/schema/put/personinfo'
OK

$ curl 'http://127.0.0.1:8080/personinfo/get/1'
{"name":"","age":0,"gender":"Unknown","emails":[]}

$ curl --data-binary @PersonInfo.update 'http://127.0.0.1:8080/personinfo/update/1'
OK

$ curl 'http://127.0.0.1:8080/personinfo/get/1'
{"name":"James Bond","age":60,"gender":"Unknown","emails":[]}

$ curl 'http://127.0.0.1:8080/personinfo/get/1/name'
"James Bond"

JPQL example

#### JPQL Simple test
$ cat jpql.put

echo 'SELECT COUNT(p.age), AVG(p.age) FROM PersonInfo p WHERE p.age >= 30 ORDER BY p.age' | \
curl -d @- 'http://127.0.0.1:8080/jpql/put/JPQL_NO_1'

$ ./jpql.put

#### watching jpql results
$ cat jpql.ask

while :
do
   sleep 1s
   curl 'http://127.0.0.1:8080/jpql/ask/JPQL_NO_1'
   printf '\n'
done

$ ./jpql.ask

#### update record with random id, repeat it to update more person's age to 80
$ cat jpql.update

RANDOM_ID=$RANDOM
JPQL="UPDATE PersonInfo p SET p.age = 80 WHERE p.id = '$RANDOM_ID'"
echo $JPQL

echo $JPQL | curl -d @- "http://127.0.0.1:8080/jpql"

$ ./jpql.update

Script example: (requires JDK8+)

A piece of JavaScript code that will be executed when field PersionInfo.name was updated: on_name.js:

function onNameUpdated() {
    var age = record.get("age");
    what_is(age);

    what_is(http_get);
    var http_get_result = http_get.apply("http://localhost:8080/ping", 5);
    java.lang.Thread.sleep(1000);
    what_is(http_get_result.value());

    what_is(http_post);
    var http_post_result = http_post.apply("http://localhost:8080/personinfo/put/2/age", "888", 5);
    java.lang.Thread.sleep(1000);
    what_is(http_post_result.value());

    for (i = 0; i < binlogs.length; i++) {
        var binlog = binglogs[i];
        what_is(binlog.type());
        what_is(binlog.xpath());
        what_is(binlog.value());
    }
}

function what_is(value) {
    print(id + ": " + value);
}

onNameUpdated();

Try it:

$ curl --data-binary @on_name.js \
 'http://127.0.0.1:8080/personinfo/script/put/name/SCRIPT_NO_1'
OK

$ curl --data '"John"' 'http://127.0.0.1:8080/personinfo/put/1/name'
OK

$ curl 'http://127.0.0.1:8080/personinfo/get/2/age'
888

Example 2: With Embedded Type

Schema: hatInventory.avsc

{
  "type" : "record",
  "name" : "hatInventory",
  "namespace" : "chana",
  "fields" : [ {
    "name" : "sku",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "description",
    "type" : {
      "type" : "record",
      "name" : "hatInfo",
      "fields" : [ {
        "name" : "style",
        "type" : "string",
        "default" : ""
      }, {
        "name" : "size",
        "type" : "string",
        "default" : ""
      }, {
        "name" : "color",
        "type" : "string",
        "default" : ""
      }, {
        "name" : "material",
        "type" : "string",
        "default" : ""
      } ]
    },
    "default" : { }
  } ]
}

Try it:

$ cd src/test/resources/avsc

$ curl --data @hatInventory.avsc 'http://127.0.0.1:8080/schema/put/hatinv'
OK

$ curl 'http://127.0.0.1:8080/hatinv/get/1'
{"sku":"","description":{"style":"","size":"","color":"","material":""}}

$ curl --data '{"style":"classic","size":"Large","color":"Red"}' \
 'http://127.0.0.1:8080/hatinv/put/1/description'
OK

$ curl 'http://127.0.0.1:8080/hatinv/get/1'
{"sku":"","description":{"style":"classic","size":"Large","color":"Red","material":""}}

$ curl 'http://127.0.0.1:8080/hatinv/get/1/description'
{"style":"classic","size":"Large","color":"Red","material":""}

$ ab -c100 -n100000 -k 'http://127.0.0.1:8080/hatinv/get/1?benchmark_only=1024'

Simple benchmark for REST-JSON API (too simple too naive)

Environment:

HOST: Dell Inc. PowerEdge R420/0VD50G
CPU: 2 x Intel(R) Xeon(R) CPU E5-2420 v2 @ 2.20GHz (12 #core, 24 #HT)
OS: CentOS Linux release 7.0.1406 (Core)

Simple GET/PUT REST-JSON Result:

Simple GET: 169,437 [req#/sec] (mean)
Simple PUT: 102,961 [req#/sec] (mean)

Details:

To run:

sbt run
cd src/test/resources/avsc
./bench-get.sh
./bench-put.sh
Preface

chana stores Avro record, with two groups of APIs:

  • Primitive API (Scala/Java)
  • RESTful API
Primitive API (Scala / Java)

use XPath expression to locate avro field. See XPath

1. Schema
case class PutSchema(entityName: String, schema: String, entityFullName: Option[String], idleTimeout: Duration)
case class RemoveSchema(entityName: String)
2. Basic operations
case class GetRecord(id: String)
case class GetRecordAvro(id: String)
case class GetRecordJson(id: String)
case class PutRecord(id: String, record: Record)
case class PutRecordJson(id: String, record: String)
case class GetField(id: String, field: String)
case class GetFieldAvro(id: String, field: String)
case class GetFieldJson(id: String, field: String)
case class PutField(id: String, field: String, value: Any)
case class PutFieldJson(id: String, field: String, value: String)

case class Select(id: String, path: String)
case class SelectAvro(id: String, path: String)
case class SelectJson(id: String, path: String)
case class Update(id: String, path: String, value: Any)
case class UpdateJson(id: String, path: String, value: String)
3. Operations applicable on Array / Map
case class Insert(id: String, path: String, value: Any)
case class InsertJson(id: String, path: String, value: String)
case class InsertAll(id: String, path: String, values: List[_])
case class InsertAllJson(id: String, path: String, values: String)
case class Delete(id: String, path: String)
case class Clear(id: String, path: String)
4. Script
case class PutScript(entity: String, field: String, id: String, script: String)
case class RemoveScript(entity: String, field: String, id: String)
REST API
Put schema
POST /schema/put/$entityName?fullname=entity_full_name&timeout=1000

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
<SCHEMA_STRING>

parameters:

  • fullname: for schema that contains multiple referenced complex types in union, you should provide the full name of main entry. Optional
  • timeout: idle timeout in milliseconds. Optional
Del schema
GET /schema/del/$entityName/

Host: status.wandoujia.com
Get record
GET /$entity/get/$id/

Host: status.wandoujia.com
Get record field
GET /$entity/get/$id/$field

Host: status.wandoujia.com
Put record
POST /$entity/put/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
<JSON_STRING>
Put record field
POST /$entity/put/$id/$field

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
<JSON_STRING>
Select
POST /$entity/select/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
Update
POST /$entity/update/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
<JSON_STRING>

Example (update array field -> record’s number field):

POST /account/update/12345/
BODY:
/chargeRecords[1].time
1234

Example (update map field -> record’s number field):

POST /account/update/12345/
BODY:
/devApps/@a/numBlackApps
1234
Insert (applicable for Array / Map only)
POST /$entity/insert/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
<JSON_STRING>

Example (insert to array field):

POST /account/insert/12345/
BODY:
/chargeRecords
{"time": 4, "amount": -4.0}

Example (insert to map field):

POST /account/insert/12345/
BODY:
/devApps
{"h" : {"numBlackApps": 10}}
InsertAll (applicable for Array / Map only)
POST /$entity/insertall/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
<JSON_STRING>

Example (insert to array field):

POST /account/insertall/12345/
BODY:
/chargeRecords
[{"time": -1, "amount": -5.0}, {"time": -2, "amount": -6.0}]

Example (insert to map field):

POST /account/insertall/12345/
BODY:
/devApps
{"g" : {}, "h" : {"numBlackApps": 10}}
Delete (applicable for Array / Map only)
POST /$entity/delete/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
Clear (applicable for Array / Map only)
POST /$entity/clear/$id/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
$xpath
Put Script (apply on all instances of this entity)
POST /$entity/script/put/$field/$scriptid/

Host: status.wandoujia.com
Content-Type: application/octet-stream
Content-Length: NNN

BODY:
<JavaScript>
Del Script (apply on all instances of this entity)
GET /$entity/script/del/$field/$scriptid/

Host: status.wandoujia.com

Note:

  • Replace $entity with the object/table/entity name
  • Replace $id with object id
  • Replace $xpath with actual xpath expression
  • Put the $xpath and JSON format value(s) for update / insert / insertall in POST body, separate $xpath and JSON value(s) with \n, and make sure it’s encoded as binary, set Content-Type: application/octet-stream
Scripting supporting

The bindings that could be accessed in script:

def prepareBindings(onUpdated: OnUpdated) = {
  val bindings = new SimpleBindings
  bindings.put("http_get", http_get)
  bindings.put("http_post", http_post)
  bindings.put("id", onUpdated.id)
  bindings.put("record", record)
  bindings.put("binlogs", binlogs)
  bindings
}

Where,

  • http_get: a function could be invoked via http_get.apply(url: CharSequence, timeoutInSeconds: Int), returns scala.concurrent.Future[Any]
  • http_post: a function could be invoked via http_post.apply(url: CharSequence, body: CharSequence, timeoutInSeconds: Int) returns scala.concurrent.Future[Any]
  • id: the id of this entity
  • record: the entity record after updated
  • binlogs: array of Binlog(s) during this updating action
  • binlogs[i].type(): -1 - Clear, 0 - Delete, 1 - Change, 2 - Insert
  • binlogs[i].xpath(): XPath Location of changed value
  • binlogs[i].value(): value - Change/Insert, keys - Delete, void - Clear
  • The JavaScript code should do what ever operation via function only. You can define local variables in function, and transfer these local vars between functions to share them instead of defining global vars.

Reference

chana's People

Contributors

briantopping avatar cowboy129 avatar dcaoyuan avatar donderom avatar taigetco avatar yangl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chana's Issues

Push to Sonatype

Hey guys, cool project! :)

Could this get pushed to Sonatype?

Windows case insensitive

Windows is case insensitive, so some problem occur after cloning the code base on window as the Chana.scala and chana.scala are in the same path.

relationship between schema-registry and chana

can Chana used as a schema-registry like thishttps://github.com/confluentinc/schema-registry?
what is the relationship,if i want to use chana as schema-registry,what else i need do?

Compilation issue

Getting errors building. Anything I can check on my local environment?

Brians-MBP:chana brian$ sbt publishLocal publishM2
[info] Loading global plugins from /Users/brian/.sbt/0.13/plugins
[info] Loading project definition from /Users/brian/dev/chana/project
[info] Set current project to chana (in build file:/Users/brian/dev/chana/)
[info] Avro compiler using stringType=String
[info] Formatting 14 Scala sources {file:/Users/brian/dev/chana/}chana-avro(compile) ...
[info] Compiling Avro schema /Users/brian/dev/chana/chana-avro/src/test/resources/avsc/Record.avsc
[info] Packaging /Users/brian/dev/chana/chana-avro/target/scala-2.11/chana-avro_2.11-0.2.0-SNAPSHOT-sources.jar ...
[info] Packaging /Users/brian/dev/chana/target/scala-2.11/chana_2.11-0.2.0-SNAPSHOT-sources.jar ...
[info] Updating {file:/Users/brian/dev/chana/}chana-avro...
[info] Formatting 81 Scala sources {file:/Users/brian/dev/chana/}chana(compile) ...
[info] Done packaging.
[info] Done packaging.
[info] Resolving org.apache.avro#avro;1.7.7 ...
[info] Rats! got a .rats file /Users/brian/dev/chana/chana-avro/src/main/scala/chana/xpath/rats/XPathGrammar.rats
[info] Rats! got a .rats file /Users/brian/dev/chana/src/main/scala/chana/jpql/rats/JPQLGrammar.rats
[info] Resolving org.apache.commons#commons-compress;1.4.1 ...
[info] Running Rats! on /Users/brian/dev/chana/chana-avro/src/main/scala/chana/xpath/rats/XPathGrammar.rats, input from /Users/brian/dev/chana/chana-avro/src/main/scala/chana/xpath/rats and /Users/brian/dev/chana/chana-avro/target/sbt-rats, output to /Users/brian/dev/chana/chana-avro/target/sbt-rats/chana/xpath/rats
[info] Running Rats! on /Users/brian/dev/chana/src/main/scala/chana/jpql/rats/JPQLGrammar.rats, input from /Users/brian/dev/chana/src/main/scala/chana/jpql/rats and /Users/brian/dev/chana/target/sbt-rats, output to /Users/brian/dev/chana/target/sbt-rats/chana/jpql/rats
[info] Resolving com.fasterxml.jackson.core#jackson-core;2.6.3 ...
xtc.tree.VisitorException: Internal error while visiting node xtc.parser.OrderedChoice@7b674838 with visitor xtc.parser.Resolver@92a033c
    at xtc.parser.Resolver.visit(Resolver.java:1918)
    at xtc.parser.Resolver.visit(Resolver.java:1943)
    at xtc.parser.Resolver.visit(Resolver.java:1908)
    at xtc.parser.Resolver.visit(Resolver.java:1903)
    at xtc.parser.Analyzer.process(Analyzer.java:1278)
    at xtc.parser.Resolver.check(Resolver.java:1034)
    at xtc.parser.Resolver.visit(Resolver.java:1739)
    at xtc.parser.Rats.process(Rats.java:292)
    at xtc.util.Tool.run(Tool.java:548)
    at SBTRatsPluginPatched$.runRatsImpl(SBTRatsPlugin.scala:437)
    at SBTRatsPluginPatched$.runGeneratorsImpl(SBTRatsPlugin.scala:214)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:153)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:152)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:249)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:245)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:206)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:245)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:244)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:200)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:244)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:242)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:158)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:144)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:35)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
[info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.1 ...
[info] Done updating.
[info] Updating {file:/Users/brian/dev/chana/}chana...
[info] Wrote /Users/brian/dev/chana/chana-avro/target/scala-2.11/chana-avro_2.11-0.2.0-SNAPSHOT.pom
[info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.1 ...
[info] Done updating.
[info] :: delivering :: com.wandoulabs.chana#chana-avro_2.11;0.2.0-SNAPSHOT :: 0.2.0-SNAPSHOT :: integration :: Sun Mar 13 16:42:03 MDT 2016
[info]  delivering ivy file to /Users/brian/dev/chana/chana-avro/target/scala-2.11/ivy-0.2.0-SNAPSHOT.xml
[info] Wrote /Users/brian/dev/chana/target/scala-2.11/chana_2.11-0.2.0-SNAPSHOT.pom
[info] :: delivering :: com.wandoulabs.chana#chana_2.11;0.2.0-SNAPSHOT :: 0.2.0-SNAPSHOT :: integration :: Sun Mar 13 16:42:03 MDT 2016
[info]  delivering ivy file to /Users/brian/dev/chana/target/scala-2.11/ivy-0.2.0-SNAPSHOT.xml
java.lang.RuntimeException: Rats!, can't find generated file /Users/brian/dev/chana/target/sbt-rats/chana/jpql/rats/JPQLGrammar.java
    at scala.sys.package$.error(package.scala:27)
    at SBTRatsPluginPatched$.runRatsImpl(SBTRatsPlugin.scala:478)
    at SBTRatsPluginPatched$.runGeneratorsImpl(SBTRatsPlugin.scala:214)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:153)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:152)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:249)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:245)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:206)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:245)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:244)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:200)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:244)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:242)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:158)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:144)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:35)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.lang.RuntimeException: Rats! failed
    at scala.sys.package$.error(package.scala:27)
    at SBTRatsPluginPatched$.runRatsImpl(SBTRatsPlugin.scala:446)
    at SBTRatsPluginPatched$.runGeneratorsImpl(SBTRatsPlugin.scala:214)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:153)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1$$anonfun$12.apply(SBTRatsPlugin.scala:152)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$1.apply(Tracked.scala:235)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:249)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3$$anonfun$apply$4.apply(Tracked.scala:245)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:206)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:245)
    at sbt.FileFunction$$anonfun$cached$2$$anonfun$apply$3.apply(Tracked.scala:244)
    at sbt.Difference.apply(Tracked.scala:224)
    at sbt.Difference.apply(Tracked.scala:200)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:244)
    at sbt.FileFunction$$anonfun$cached$2.apply(Tracked.scala:242)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:158)
    at SBTRatsPluginPatched$$anonfun$runGenerators$1.apply(SBTRatsPlugin.scala:144)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:35)
    at scala.Function6$$anonfun$tupled$1.apply(Function6.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] (chana/compile:managedSources) Rats!, can't find generated file /Users/brian/dev/chana/target/sbt-rats/chana/jpql/rats/JPQLGrammar.java
[error] (chana-avro/compile:managedSources) Rats! failed
[error] Total time: 5 s, completed Mar 13, 2016 4:42:03 PM

sbt run warn

osx 10.10.4
jdk oracle 1.8.51

[email protected]:/Users/edwin/workspace  $ cd chana 
[email protected]:/Users/edwin/workspace/chana  git:(master*) $ sbt run
[info] Loading project definition from /Users/edwin/Documents/workfolder/workspace/chana/project
[info] Compiling 2 Scala sources to /Users/edwin/Documents/workfolder/workspace/chana/project/target/scala-2.10/sbt-0.13/classes...
[info] Set current project to chana (in build file:/Users/edwin/Documents/workfolder/workspace/chana/)
[info] Compiling 9 Scala sources and 8 Java sources to /Users/edwin/Documents/workfolder/workspace/chana/avpath/target/scala-2.11/classes...
[info] 'compiler-interface' not yet compiled for Scala 2.11.6. Compiling...
[info]   Compilation completed in 8.678 s
[warn] there were two feature warnings; re-run with -feature for details
[warn] one warning found
[warn] 未与 -source 1.6 一起设置引导类路径
[info] /Users/edwin/Documents/workfolder/workspace/chana/avpath/target/scala-2.11/src_managed/test/java/compiled_avro/chana/avro/test/Account.java: 某些输入文件使用了未经检查或不安全的操作。
[info] /Users/edwin/Documents/workfolder/workspace/chana/avpath/target/scala-2.11/src_managed/test/java/compiled_avro/chana/avro/test/Account.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
[info] Compiling 69 Scala sources and 2 Java sources to /Users/edwin/Documents/workfolder/workspace/chana/target/scala-2.11/classes...
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/collection/ArrayList.scala:297: method insert overrides concrete, non-deprecated symbol(s):    insert
[warn]   override def insert(n: Int, elems: A*) {
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStampedMapBasedList.scala:162: method + overrides concrete, non-deprecated symbol(s):    +
[warn]   override def +(elem: A): this.type = {
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStampedMapBasedList.scala:168: method insertOne overrides concrete, non-deprecated symbol(s):    insertOne
[warn]   override def insertOne(n: Int, elem: A) {
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStampedMapBasedList.scala:173: method insertAll overrides concrete, non-deprecated symbol(s):    insertAll
[warn]   override def insertAll(n: Int, elems: scala.collection.Traversable[A]) {
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStampedMapBasedList.scala:247: method companion overrides concrete, non-deprecated symbol(s):    companion, companion, companion, companion, companion, companion, companion, companion, companion, companion, companion, companion, companion, companion
[warn]   override def companion: GenericCompanion[TStampedMapBasedList] = throw new UnsupportedOperationException()
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStampedMapBasedList.scala:256: method partition overrides concrete, non-deprecated symbol(s):    partition
[warn]   override def partition(p: A => Boolean): (TStampedMapBasedList[A], TStampedMapBasedList[A]) = {
[warn]                ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStamps.scala:634: method partition overrides concrete, non-deprecated symbol(s):    partition
[warn]     override def partition(p: Long => Boolean): (TStampsOnOccurred, TStampsOnOccurred) = {
[warn]                  ^
[warn] /Users/edwin/Documents/workfolder/workspace/chana/src/main/scala/chana/timeseries/TStamps.scala:873: method partition overrides concrete, non-deprecated symbol(s):    partition
[warn]     override def partition(p: Long => Boolean): (TStampsOnCalendar, TStampsOnCalendar) = {
[warn]                  ^
[warn] there were two feature warnings; re-run with -feature for details
[warn] 9 warnings found
[warn] 未与 -source 1.6 一起设置引导类路径
[info] Running chana.Chana 
2015-08-04T12:46:09.658 INFO [lt-dispatcher-3] a.e.s.Slf4jLogger - Slf4jLogger started
2015-08-04T12:46:09.832 INFO [lt-dispatcher-4] Remoting - Starting remoting
2015-08-04T12:46:10.046 INFO [lt-dispatcher-4] Remoting - Remoting started; listening on addresses :[akka.tcp://[email protected]:2551]
2015-08-04T12:46:10.049 INFO [lt-dispatcher-4] Remoting - Remoting now listens on addresses: [akka.tcp://[email protected]:2551]
2015-08-04T12:46:10.064 INFO [lt-dispatcher-4] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Starting up...
2015-08-04T12:46:10.065 INFO [lt-dispatcher-4] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Using a dedicated scheduler for cluster. Default scheduler can be used if configured with 'akka.scheduler.tick-duration' [10 ms] <=  'akka.cluster.scheduler.tick-duration' [9 ms].
2015-08-04T12:46:10.162 INFO [lt-dispatcher-4] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Registered cluster JMX MBean [akka:type=Cluster]
2015-08-04T12:46:10.163 INFO [lt-dispatcher-4] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Started up successfully
2015-08-04T12:46:11.288 INFO [lt-dispatcher-2] s.c.s.HttpListener - Bound to /127.0.0.1:8080
2015-08-04T12:46:11.290 INFO [lt-dispatcher-3] a.r.RemoteActorRefProvider$RemoteDeadLetterActorRef - Message [akka.io.Tcp$Bound] from Actor[akka://ChanaSystem/user/IO-HTTP/listener-0#861758154] to Actor[akka://ChanaSystem/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
2015-08-04T12:46:15.216 INFO [t-dispatcher-19] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Node [akka.tcp://[email protected]:2551] is JOINING, roles [entity]
2015-08-04T12:46:16.195 INFO [lt-dispatcher-3] Cluster(akka://ChanaSystem) - Cluster Node [akka.tcp://[email protected]:2551] - Leader is moving node [akka.tcp://[email protected]:2551] to [Up]


JPQL example vs traditional SQL

Compared with traditional SQL query. It seems that the query has status and the query result can be monitored continuously and the result is updated once some monitored values change.

Is there any differences when doing the query optimization on the Query plan? What is the special aspect for JPQL on Chana?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.