2016-08-12 2 views
2

bigint型の属性を持つ最小限のエンティティを作成しましたが、問題は特定の値に対してクエリが失敗することです。これはスキーマです:bigint属性を使用したクエリ特定の値に対して空の戻り値

[{:db/ident :home/area, 
    :db/valueType :db.type/bigint, 
    :db/cardinality :db.cardinality/one, 
    :db/doc "the doc", 
    :db.install/_attribute :db.part/db, 
    :db/id #db/id[:db.part/db -1000013]}] 

私はサンプル値を挿入:

(d/transact (d/connect uri2) 
      [{ 
       :db/id #db/id[:db.part/user] 
       :home/area 123456789000000N} 
      ]) 

をし、それがdatomicコンソールを使用して作成されたことを確認しました。次のクエリは、以前に挿入されたエンティティを期待通りに返しません。

(d/q '[ 
     :find ?e 
     :in $ ?h 
     :where 
     [?e :home/area ?h]] 
    (d/db (d/connect uri2)) 
    123456789000000N 
    ) 
;;--- #{} 

多分値が表現される方法で何かが失われています。属性に100Nのような別の値を使用して別のテスト:

(d/transact (d/connect uri2) 
      [{ 
       :db/id #db/id[:db.part/user] 
       :home/area 100N} 
      ]) 

(d/q '[ 
     :find ?e 
     :in $ ?h 
     :where 
     [?e :home/area ?h]] 
    (d/db (d/connect uri2)) 
    100N 
    ) 
;;-- #{[17592186045451]} 

はまた私に混乱している値111111111111111111111111111111111111Nで正常に動作します:ホーム/面積は正しい答えを返します。

Datomic版: "0.9.5390" Javaのバージョン "1.8.0_05" Javaの(TM)SE ランタイム環境(1.8.0_05-B13を構築する)は、Java HotSpot(TM)64ビット サーバーVM(ビルド25.5-b02、mixed mode)ストレージサービスとしてのMySQL

ご意見ありがとうございます。

答えて

1

Clojureのユーザーには、〜java.math.BigIntegerではなくclojure.lang.BigIntであるため、:db.type/bigintという名前は誤解を招く可能性があります。

同じ手順を再現しましたが、123456789000000NではDatalogクエリが失敗した理由はわかりませんが、100Nおよび111111111111111111111111111111111111Nでは失敗しています。しかし、次のようなことが常に起こっているようです。

+0

私はあなたの提案(.toBigIntegerメソッドを使用)の後に3つの例を変更し、すべて正常に動作します。確かに、クエリバインディング中の値と関連しています。その背後にある理由を引き続き検索しますが、この回避策をプロジェクトに使用できます。ありがとうValentin –

1

私はあなたの例を走らせて、結果は異なっています(すべての場合に効果があります)。理由は分かりませんが、私の例を追加すると助けになります。私が行った唯一の変更はuri2の代わりにuriを使用し、私はスキーマをスラップし、(def conn (d/connect uri))(d/create-database uri)を実行しました。

Clojure 1.8.0 
user=> (use '[datomic.api :only [q db] :as d]) 
nil 
user=> (use 'clojure.pprint) 
nil 
user=> (def uri "datomic:mem://bigint") 
#'user/uri 
user=> (d/create-database uri) 
true 
user=> (def conn (d/connect uri)) 
#'user/conn 
user=> (def schema-tx (read-string (slurp "path/to/the/schema.edn"))) 
#'user/schema-tx 
user=> @(d/transact conn schema-tx) 
{:db-before [email protected], 
     :db-after [email protected], 
:tx-data [#datom[13194139534312 50 #inst "2016-08-14T18:53:23.158-00:00" 13194139534312 true] 
     #datom[63 10 :home/area 13194139534312 true] #datom[63 40 60 13194139534312 true] 
     #datom[63 41 35 13194139534312 true] #datom[63 62 "the doc" 13194139534312 true] 
     #datom[0 13 63 13194139534312 true]], 
:tempids {-9223367638809264717 63}} 

(d/transact (d/connect uri) 
    [{ 
:db/id #db/id[:db.part/user] 
:home/area 123456789000000N} 
    ]) 
#object[datomic.promise$settable_future$reify__6480 0x5634d0f4 
    {:status :ready, :val {:db-before [email protected], 
             :db-after [email protected], 
          :tx-data [#datom[13194139534313 50 #inst "2016-08-14T18:53:34.325-00:00" 13194139534313 true] 
            #datom[17592186045418 63 123456789000000N 13194139534313 true]], 
          :tempids {-9223350046623220288 17592186045418}}}] 
(d/q '[ 
    :find ?e 
    :in $ ?h 
    :where 
    [?e :home/area ?h]] 
    (d/db (d/connect uri)) 
    123456789000000N 
    ) 
#{[17592186045418]} 

(d/transact (d/connect uri) 
    [{ 
:db/id #db/id[:db.part/user] 
:home/area 100N} 
    ]) 
#object[datomic.promise$settable_future$reify__6480 0x3b27b497 
    {:status :ready, :val {:db-before [email protected], 
             :db-after [email protected], 
          :tx-data [#datom[13194139534315 50 #inst "2016-08-14T18:54:13.347-00:00" 13194139534315 true] 
            #datom[17592186045420 63 100N 13194139534315 true]], 
          :tempids {-9223350046623220289 17592186045420}}}] 
(d/q '[ 
    :find ?e 
    :in $ ?h 
    :where 
    [?e :home/area ?h]] 
    (d/db (d/connect uri)) 
    100N 
    ) 
#{[17592186045420]} 
    user=> 

は、あなたのスキーマがトランザクションを確認するためにREPLライン上(first schema-tx)を実行することができます:私はあなたが私の例では、働いていた、なぜ私にはわからない理由で同様の手順を、行っ仮定しますか? /bigintが定義されていないか、最初にuriを見ていたのかどうか疑問に思っています(私はあなたに2があったことに気がついたので、複数の例があると仮定しています)。

+0

Jaret、私はあなたのコードで示したすべてのステップを実行し、すべて期待どおりに動作するので、おそらく、ストレージに関連するものがあります(memを使用し、MySQLを使用しています)。 (最初のschema-tx)の結果は次のとおりです。 {:db/ident:home/area、:db/valueType:db.type/bigint、:db/cardinality:db.cardinality/one、:db/doc "doc"、:db.install/_attribute:db.part/db、:db/id#db/id [:db。part/db -1000013]} また、スキーマが正常に作成されたことを確認しました。 –

+0

@CésarCastilloValentin Waeselynckが正しいです。 clojure.lang.BigIntとjava.math.BigIntegerは実際にはほとんど互換性がありますが、Datomicクエリは異なる方法の1つに依存しているように見えます。代わりにjava BigIntegerをクエリに渡すと、うまくいくはずです。メモリバージョンは、同じオブジェクトインスタンスを使用しているため動作します。 –

関連する問題