datomic

Ask questions on the official Q&A site at https://ask.datomic.com!
joshkh 2021-06-19T07:46:28.246900Z

can i pass a rule name into a query as an argument without a macro?

(d/q '{:find  [?player]
       :in    [$ % ?rule-name ?player-name]
       :where [[?player :player/name ?player-name]
               (?rule-name ?player)]}
     db rules 'is-player "player1") 

Execution error (IllegalArgumentException) at datomic.core.datalog/resolve-id (datalog.clj:330).
Cannot resolve key: is-player

Joe Lane 2021-06-20T19:00:19.255800Z

Use clojure to construct the query as data

(defn query-players
  [db rules player-name wants-is-player-rule?]
  (->
   (cond->
       '{:find  [?player]
         :in    [$ % ?player-name]
         :where [[?player :player/name ?player-name]]}
     wants-is-player-rule? (update :where conj '(?is-player ?player)))
   (d/q db rules player-name)))

(query-players (d/db conn) the-rules "player1" true)

kenny 2021-06-19T15:40:15.248200Z

Can you rely upon the Datomic Cloud endpoint address always following the format: <http://entry>.&lt;system&gt;.&lt;region&gt;.<http://datomic.net:8182|datomic.net:8182> ?

Joe Lane 2021-06-20T17:49:27.255100Z

No, it’s an address, addresses can change.

kenny 2021-06-20T19:03:20.257100Z

Oh interesting. When does it change at the moment? What’s the migration strategy to go from one format to another?

Joe Lane 2021-06-20T19:05:05.257300Z

At the moment it doesn't, but you asked if you can rely on the endpoint address "ALWAYS" following that format.

kenny 2021-06-20T20:29:59.258Z

I see. If it were to change, how could that be done safely?

Joe Lane 2021-06-20T20:47:18.259500Z

It’s just a different string. What if the endpoint had a uuid in it? I’m not sure what you mean by “safely”.

kenny 2021-06-20T20:56:21.261Z

If it were to change, client applications would need to know about which endpoint to point to. By safely I mean informing the client application which endpoint it should use before and after the switch.

Joe Lane 2021-06-20T22:00:29.262900Z

“Client applications” meaning not ions?

kenny 2021-06-20T22:00:43.263200Z

Correct

Joe Lane 2021-06-20T22:01:01.263800Z

How do they know what endpoint to hit right now?

kenny 2021-06-20T22:11:46.264900Z

Statically defined string at startup. Seems like a switch of that endpoint would be require application downtime.

Joe Lane 2021-06-20T22:45:48.269200Z

Doubtful. That statement is only true because you aren’t using a mechanism to dynamically update that endpoint and the datomic client using it.

Joe Lane 2021-06-20T22:50:55.270600Z

Imagine switching the query groups your client applications point to with zero downtime. How would you do it?

kenny 2021-06-21T00:34:18.272200Z

Oh I see. You’re saying in the event Datomic changes it’s endpoint, we’d need to do an A B switchover by deploying an entirely new query group?

Joe Lane 2021-06-21T01:10:11.276Z

That in combination with either deploying a separate set of client applications pointed at the new QG or having your client applications being able to reset their clients and connections by polling for config values at a low rate (15 mins)