{"id":20802351,"url":"https://github.com/taywils/patomic","last_synced_at":"2025-05-07T00:46:37.474Z","repository":{"id":10565240,"uuid":"12768985","full_name":"taywils/patomic","owner":"taywils","description":"An Object Oriented PHP interface for the Datomic REST API","archived":false,"fork":false,"pushed_at":"2014-10-15T03:40:19.000Z","size":920,"stargazers_count":28,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-31T04:41:15.361Z","etag":null,"topics":["datomic","edn","php"],"latest_commit_sha":null,"homepage":"http://taywils.github.io/patomic/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taywils.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-09-11T22:03:23.000Z","updated_at":"2022-09-23T10:39:51.000Z","dependencies_parsed_at":"2022-09-08T00:21:16.811Z","dependency_job_id":null,"html_url":"https://github.com/taywils/patomic","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taywils%2Fpatomic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taywils%2Fpatomic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taywils%2Fpatomic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taywils%2Fpatomic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taywils","download_url":"https://codeload.github.com/taywils/patomic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252793568,"owners_count":21805055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datomic","edn","php"],"created_at":"2024-11-17T18:30:45.387Z","updated_at":"2025-05-07T00:46:37.466Z","avatar_url":"https://github.com/taywils.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Patomic - An Object Oriented PHP interface for the Datomic REST API\n===================================================================\n\n[![Build Status](https://travis-ci.org/taywils/patomic.svg?branch=master)](https://travis-ci.org/taywils/patomic)\n\nRequirements\n-----------\n1. The full Java dev environment [java.com](http://www.java.com) both JDK and JRE\n2. Datomic free edition [datomic.com/free](http://downloads.datomic.com/free.html)\n3. [Composer](http://getcomposer.org/)\n4. PHP \u003e= 5.4 (It uses traits)\n\nQuickstart\n----------\nOnce you have met the requirements and downloaded Datomic.\n\n```\n$ cd [directory_where_datomic_is_installed]\n$ ./bin/rest -p 9998 example datomic:mem://\n```\n\nNow create a new directory somewhere on your hard drive which will hold your new Patomic project files.\n\n```\n$ cd ~\n$ mkdir [my_patomic_project_name]\n$ cd [my_patomic_project_name]\n$ touch composer.json\n```\n\nAdd the following to your composer.json in order to have composer install Patomic for your project.\n\n```javascript\n{\n  \"require\": {\n    \"taywils/patomic\": \"dev-master\",\n    \"igorw/edn\": \"1.0.*@dev\",\n    \"nikic/phlexy\": \"1.0.*@dev\"\n  }\n}\n```\n\nRun composer install and watch for any possible errors.\nThis step may vary depending on how/where you installed composer but for a typical Linux machine running the latest version of Ubuntu.\n\n```\n$ sudo php composer.phar install\n```\n\nWithin the same directory we now want to create a new file; lets call it app.php\n\n```\n$ touch app.php\n```\n\nUse your favorite editor/IDE and open app.php and add the following.\n\n```php\n\u003c?php\n/* app.php */\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse \\taywils\\Patomic\\Patomic;\nuse \\taywils\\Patomic\\PatomicEntity;\nuse \\taywils\\Patomic\\PatomicTransaction;\nuse \\taywils\\Patomic\\PatomicQuery;\nuse \\taywils\\Patomic\\PatomicException;\n\nfunction createDb() {\n  $patomic = new Patomic(\"http://localhost\", 9998, \"mem\", \"example\");\n  $patomic-\u003ecreateDatabase(\"blog\");\n  $patomic-\u003esetDatabase(\"blog\");\n}\n\ntry {\n  createDb();\n} catch(PatomicException $pe) {\n  echo $pe-\u003egetMessage() . PHP_EOL;\n}\n```\n\nRun it and you should have a new Datomic instance using in memory storage running on http://localhost:9998 (If you have an application running on port 9998 feel free to use a different port). For more information on the Datomic REST web interface please read the official documentation found at [http://docs.datomic.com/rest.html](http://docs.datomic.com/rest.html).\n\nLet's create a simple schema to demonstrate how Patomic helps PHP developers take advantage of Datomic. Say you want to create the following schema; (don't forget that Patomic can also import .edn files)\n\n```edn\n{:db/id #db/id[:db.part/db]\n :db/ident :author/firstName\n :db/valueType :db.type/string\n :db/cardinality :db.cardinality/one\n :db/doc \"Blog post author's first name\"\n :db.install/_attribute :db.part/db}\n\n {:db/id #db/id[:db.part/db]\n :db/ident :author/lastName\n :db/valueType :db.type/string\n :db/cardinality :db.cardinality/one\n :db/doc \"Blog post author's last name\"\n :db.install/_attribute :db.part/db}\n\n {:db/id #db/id[:db.part/db]\n :db/ident :author/favoriteColor\n :db/valueType :db.type/string\n :db/cardinality :db.cardinality/one\n :db/doc \"Blog post author's favorite color\"\n :db.install/_attribute :db.part/db}\n ```\n\n Those familiar with EDN will feel right at home but for a PHP developer the following is the Patomic equivalent.\n\n```php\n/* Add this to your existing app.php */\n\n function createSchema() {\n     $authorFirstName = new PatomicEntity();\n     $authorFirstName\n        -\u003eident(\"author\", \"firstName\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's first name\")\n        -\u003einstall(\"attribute\");\n\n     $authorLastName = new PatomicEntity();\n     $authorLastName\n        -\u003eident(\"author\", \"lastName\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's last name\")\n        -\u003einstall(\"attribute\");\n\n     $authorFavColor = new PatomicEntity();\n     $authorFavColor\n        -\u003eident(\"author\", \"favoriteColor\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's favorite color\")\n        -\u003einstall(\"attribute\");\n\n     $pt = new PatomicTransaction();\n     $pt-\u003eappend($authorFirstName)\n        -\u003eappend($authorLastName)\n        -\u003eappend($authorFavColor);\n\n    return $pt;\n}\n```\n\nNow we'll demonstrate how to add data to our schema, for instance consider the following EDN.\n\n```edn\n[\n {:db/id #db/id [:db.part/user]\n  :author/firstName \"Sam\"\n  :author/lastName \"Smith\"\n  :author/favoriteColor \"Green\"}\n\n {:db/id #db/id [:db.part/user]\n  :author/firstName \"Melissa\"\n  :author/lastName \"Grey\"\n  :author/favoriteColor \"Purple\"}\n\n {:db/id #db/id [:db.part/user]\n  :author/firstName \"Danny\"\n  :author/lastName \"Ward\"\n  :author/favoriteColor \"Orange\"}\n]\n```\n\nWithin Patomic we'll represent the transaction to add data as the following.\n\n```php\n/* Add this to your existing app.php */\n\nfunction addData() {\n    $pt = new PatomicTransaction();\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Sam\"),\n        array(\"author\" =\u003e \"lastName\", \"Smith\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Green\")\n    );\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Melissa\"),\n        array(\"author\" =\u003e \"lastName\", \"Grey\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Purple\")\n    );\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Danny\"),\n        array(\"author\" =\u003e \"lastName\", \"Ward\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Orange\")\n    );\n\n    return $pt;\n}\n```\n\nTo query our data lets first consider the EDN which is what you can use if you are already familiar with Datomic. Don't forget; for advanced users Patomic can use raw EDN queries written as strings.\n\n```edn\n[:find ?firstName ?lastName \n :in $ \n :where [?entity :author/firstName ?firstName] \n        [?entity :author/lastName ?lastName]]\n```\n\nOnce again those familiar with EDN will be right at home but for PHP devs learning EDN we use PatomicQuery objects.\n\n```php\n/* Add this to your existing app.php */\n\nfunction createQuery() {\n    $pq = new PatomicQuery();\n\n    $pq-\u003efind(\"firstName\", \"lastName\")\n        -\u003ewhere(array(\"entity\" =\u003e \"author/firstName\", \"firstName\"))\n        -\u003ewhere(array(\"entity\" =\u003e \"author/lastName\", \"lastName\"));\n\n    return $pq;\n}\n```\n\nPutting all of our functions together the last thing we need to do is create a Patomic object that will send our Transactions and run our Queries.\n\n```php\n\u003c?php\n\n/* Complete app.php */\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse \\taywils\\Patomic\\Patomic;\nuse \\taywils\\Patomic\\PatomicEntity;\nuse \\taywils\\Patomic\\PatomicTransaction;\nuse \\taywils\\Patomic\\PatomicQuery;\nuse \\taywils\\Patomic\\PatomicException;\n\nfunction createDb() {\n    $patomic = new Patomic(\"http://localhost\", 9998, \"mem\", \"example\");\n    $patomic-\u003ecreateDatabase(\"blog\");\n    $patomic-\u003esetDatabase(\"blog\");\n\n    return $patomic;\n}\n\nfunction createSchema() {\n    $authorFirstName = new PatomicEntity();\n    $authorFirstName\n        -\u003eident(\"author\", \"firstName\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's first name\")\n        -\u003einstall(\"attribute\");\n\n    $authorLastName = new PatomicEntity();\n    $authorLastName\n        -\u003eident(\"author\", \"lastName\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's last name\")\n        -\u003einstall(\"attribute\");\n\n    $authorFavColor = new PatomicEntity();\n    $authorFavColor\n        -\u003eident(\"author\", \"favoriteColor\")\n        -\u003evalueType(\"string\")\n        -\u003ecardinality(\"one\")\n        -\u003edoc(\"Blog post author's favorite color\")\n        -\u003einstall(\"attribute\");\n\n    $pt = new PatomicTransaction();\n    $pt-\u003eappend($authorFirstName)\n        -\u003eappend($authorLastName)\n        -\u003eappend($authorFavColor);\n\n    return $pt;\n}\n\nfunction addData() {\n    $pt = new PatomicTransaction();\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Sam\"),\n        array(\"author\" =\u003e \"lastName\", \"Smith\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Green\")\n    );\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Melissa\"),\n        array(\"author\" =\u003e \"lastName\", \"Grey\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Purple\")\n    );\n\n    $pt-\u003eaddMany(null,\n        array(\"author\" =\u003e \"firstName\", \"Danny\"),\n        array(\"author\" =\u003e \"lastName\", \"Ward\"),\n        array(\"author\" =\u003e \"favoriteColor\", \"Orange\")\n    );\n\n    return $pt;\n}\n\nfunction createQuery() {\n    $pq = new PatomicQuery();\n\n    $pq-\u003efind(\"firstName\", \"lastName\")\n        -\u003ewhere(array(\"entity\" =\u003e \"author/firstName\", \"firstName\"))\n        -\u003ewhere(array(\"entity\" =\u003e \"author/lastName\", \"lastName\"));\n\n    return $pq;\n}\n\ntry {\n    $patomic = createDb();\n\n    $patomic-\u003ecommitTransaction( createSchema() );\n    $patomic-\u003ecommitTransaction( addData() );\n    $patomic-\u003ecommitRegularQuery( createQuery() );\n\n    $data = $patomic-\u003egetQueryResult();\n\n    print_r($data);\n} catch(PatomicException $pe) {\n    echo $pe-\u003egetMessage() . PHP_EOL;\n}\n```\n\nLastly run app.php and you should see the following upon success.\n\n```\nINFO: Database \"blog\" created\nINFO: A Patomic object set database to blog\nINFO: commitTransaction success\nINFO: commitTransaction success\nINFO: commitQuery success\nArray\n(\n    [0] =\u003e Array\n        (\n            [firstName] =\u003e Danny\n            [lastName] =\u003e Ward\n        )\n\n    [1] =\u003e Array\n        (\n            [firstName] =\u003e Sam\n            [lastName] =\u003e Smith\n        )\n\n    [2] =\u003e Array\n        (\n            [firstName] =\u003e Melissa\n            [lastName] =\u003e Grey\n        )\n\n)\n```\n\nFor more information visit the Github page for Patomic [http://taywils.github.io/patomic/](http://taywils.github.io/patomic/)\n\nAbout/Features\n--------------\n- Patomic provides PHP developers with a way to communicate with a Datomic database.\n- Built upon igorw's wonderful EDN parser for PHP [github.com/igorw/edn](https://github.com/igorw/edn)\n- Uses composer for easy dependency management\n- Unit tested with PHPUnit\n- Can be used with HipHopVM\n\nSo What Is Datomic And Why Should I Care?\n-----------------------------------------\n- [Datomic Homepage](http://www.datomic.com)\n- [Datomic for Five Year Olds](http://www.flyingmachinestudios.com/programming/datomic-for-five-year-olds/)\n- [Rich Hickey Introduces Datomic](http://www.youtube.com/watch?v=RKcqYZZ9RDY)\n- [Datomic Blog](http://blog.datomic.com/)\n- [Learn Datalog Today](http://www.learndatalogtoday.org/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaywils%2Fpatomic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaywils%2Fpatomic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaywils%2Fpatomic/lists"}