{"id":13795601,"url":"https://github.com/zapr-oss/druidry","last_synced_at":"2025-06-10T10:14:23.175Z","repository":{"id":20592999,"uuid":"90364793","full_name":"zapr-oss/druidry","owner":"zapr-oss","description":"Java based Druid Query Generator library","archived":false,"fork":false,"pushed_at":"2023-08-06T20:28:33.000Z","size":599,"stargazers_count":194,"open_issues_count":44,"forks_count":89,"subscribers_count":14,"default_branch":"develop","last_synced_at":"2025-05-12T23:36:43.479Z","etag":null,"topics":["client","database","druid","java","query-builder"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zapr-oss.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,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-05-05T10:25:55.000Z","updated_at":"2025-02-10T21:03:55.000Z","dependencies_parsed_at":"2024-01-13T10:41:33.991Z","dependency_job_id":"83064c5f-b2f8-4739-9f71-f3c628c4402e","html_url":"https://github.com/zapr-oss/druidry","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapr-oss%2Fdruidry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapr-oss%2Fdruidry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapr-oss%2Fdruidry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapr-oss%2Fdruidry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zapr-oss","download_url":"https://codeload.github.com/zapr-oss/druidry/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapr-oss%2Fdruidry/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259054152,"owners_count":22798451,"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":["client","database","druid","java","query-builder"],"created_at":"2024-08-03T23:00:59.245Z","updated_at":"2025-06-10T10:14:23.154Z","avatar_url":"https://github.com/zapr-oss.png","language":"Java","funding_links":[],"categories":["大数据"],"sub_categories":["Spring Cloud框架"],"readme":"Welcome to project Druidry!\n=======================================\n\n![build_status](https://api.travis-ci.org/zapr-oss/druidry.svg?branch=master) [![License: Apache License 2](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt) [![javadoc](https://javadoc.io/badge2/in.zapr.druid/druidry/javadoc.svg)](https://javadoc.io/doc/in.zapr.druid/druidry)\n\nDruid is an extremely popular tool to perform OLAP queries on event data. Druid drives real-time dashboards in most of the organisations right now. We@Zapr love Druid! Therefore we want to contribute towards making Druid, even more, friendlier to the ever expanding community.\n\nWe want to make the process of deep meaningful conversations with Druid little easier. What do we mean is that we don’t want developers to write big, scary JSON anymore but instead use a simple Java-based query generator to help with the querying. \n\nCreating JSON freely can cause tedious bugs such as date type mistakes or spelling mistakes and potentially code can get bigger and messier and less readable. So, in reality, we want to keep the main focus of querying to be the use-case, not the type-checks.\n\nWe are excited to know whether you liked it or loved it, so please reach out to us at opensource@zapr.in\n\n\nDescription\n-----------\n\nDruidry is an open-source Java based utility library which supports creating query to Druid automatically taking care of following,\n\n* Type checking.\n* Spelling Checks.\n* Code reviewability and readability.\n\nThis library is still growing and does not support each and every constructs, however it supports the most common one used internally @Zapr.\n\n\nGetting Started\n---------------\n\nPrerequisite\n-----------\n\n* Maven\n* Java 8\n\nUsage\n-----\n\nAdd this in your pom.xml (assuming maven based project)\n\n```xml\n        \u003cdependency\u003e\n            \u003cgroupId\u003ein.zapr.druid\u003c/groupId\u003e\n            \u003cartifactId\u003edruidry\u003c/artifactId\u003e\n            \u003cversion\u003e${LATEST_VERSION}\u003c/version\u003e\n        \u003c/dependency\u003e\n```\n\nReplace ${LATEST_VERSION} with latest release version \n\nExamples\n--------\n\nTaking from Druid's example query\n\n```json\n\n{\n     \"queryType\": \"topN\",\n     \"dataSource\": \"sample_data\",\n     \"dimension\": \"sample_dim\",\n     \"threshold\": 5,\n     \"metric\": \"count\",\n     \"granularity\": \"all\",\n     \"filter\": {\n        \"type\": \"and\",\n          \"fields\": [\n            {\n              \"type\": \"selector\",\n              \"dimension\": \"dim1\",\n              \"value\": \"some_value\"\n            },\n            {\n              \"type\": \"selector\",\n              \"dimension\": \"dim2\",\n              \"value\": \"some_other_val\"\n            }\n          ]\n     },\n     \"aggregations\": [\n        {\n          \"type\": \"longSum\",\n          \"name\": \"count\",\n          \"fieldName\": \"count\"\n        },\n        {\n          \"type\": \"doubleSum\",\n          \"name\": \"some_metric\",\n          \"fieldName\": \"some_metric\"\n        }\n     ],\n     \"postAggregations\": [\n         {\n            \"type\": \"arithmetic\",\n            \"name\": \"sample_divide\",\n            \"fn\": \"/\",\n            \"fields\": [\n              {\n                \"type\": \"fieldAccess\",\n                \"name\": \"some_metric\",\n                \"fieldName\": \"some_metric\"\n              },\n              {\n                \"type\": \"fieldAccess\",\n                \"name\": \"count\",\n                \"fieldName\": \"count\"\n              }\n            ]\n         }\n      ],\n      \"intervals\": [\n        \"2013-08-31T00:00:00.000/2013-09-03T00:00:00.000\"\n      ]\n}\n```\n\n\n```java\nSelectorFilter selectorFilter1 = new SelectorFilter(\"dim1\", \"some_value\");\nSelectorFilter selectorFilter2 = new SelectorFilter(\"dim2\", \"some_other_val\");\n\nAndFilter filter = new AndFilter(Arrays.asList(selectorFilter1, selectorFilter2));\n\nDruidAggregator aggregator1 = new LongSumAggregator(\"count\", \"count\");\nDruidAggregator aggregator2 = new DoubleSumAggregator(\"some_metric\", \"some_metric\");\n\nFieldAccessPostAggregator fieldAccessPostAggregator1\n        = new FieldAccessPostAggregator(\"some_metric\", \"some_metric\");\n\nFieldAccessPostAggregator fieldAccessPostAggregator2\n        = new FieldAccessPostAggregator(\"count\", \"count\");\n\nDruidPostAggregator postAggregator = ArithmeticPostAggregator.builder()\n        .name(\"sample_divide\")\n        .function(ArithmeticFunction.DIVIDE)\n        .fields(Arrays.asList(fieldAccessPostAggregator1, fieldAccessPostAggregator2))\n        .build();\n\nDateTime startTime = new DateTime(2013, 8, 31, 0, 0, 0, DateTimeZone.UTC);\nDateTime endTime = new DateTime(2013, 9, 3, 0, 0, 0, DateTimeZone.UTC);\nInterval interval = new Interval(startTime, endTime);\n\nGranularity granularity = new SimpleGranularity(PredefinedGranularity.ALL);\nDruidDimension dimension = new SimpleDimension(\"sample_dim\");\nTopNMetric metric = new SimpleMetric(\"count\");\n\nDruidTopNQuery query = DruidTopNQuery.builder()\n        .dataSource(\"sample_data\")\n        .dimension(dimension)\n        .threshold(5)\n        .topNMetric(metric)\n        .granularity(granularity)\n        .filter(filter)\n        .aggregators(Arrays.asList(aggregator1, aggregator2))\n        .postAggregators(Collections.singletonList(postAggregator))\n        .intervals(Collections.singletonList(interval))\n        .build();\n\nObjectMapper mapper = new ObjectMapper();\nString requiredJson = mapper.writeValueAsString(query);\n```\n\n``` java\nDruidConfiguration config =  DruidConfiguration\n               .builder()\n               .host(\"druid.io\")\n               .endpoint(\"druid/v2/\")\n               .build();\n\nDruidClient client = new DruidJerseyClient(druidConfiguration);\nclient.connect();\nList\u003cDruidResponse\u003e responses = client.query(query, DruidResponse.class);\nclient.close();\n```\n\nSupported Features\n------------------\n\n#### Queries\n* Aggregation Queries\n    * TopN\n    * TimeSeries\n    * GroupBy\n* DruidScanQuery\n* DruidSelectQuery\n\n\n#### Aggregators\n\n* Cardinality\n* Count\n* DoubleMax\n* DoubleMin\n* DoubleSum\n* DoubleLast\n* DoubleFirst\n* FloatFirst\n* FloatLast\n* Filtered\n* HyperUnique\n* Javascript\n* LongMax\n* LongMin\n* LongSum\n* LongFirst\n* LongLast\n* DistinctCount\n* Histogram\n* [Data Sketches](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-extension.html)\n    * ThetaSketch\n    * TupleSketch\n    * QuantilesSketch\n    * HllSketchBuild\n    * HllSketchMerge\n\n#### Filters\n\n* And\n* Bound\n* In\n* Interval (Without Extraction Function)\n* Javascript\n* Not\n* Or\n* Regex\n* Search (Without Extraction Function)\n* Selector\n\n#### Post Aggregators\n* Arithmetic\n* Constant\n* FieldAccess\n* HyperUniqueCardinality\n* Javascript\n* [Data Sketches](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-extension.html)\n    * [Theta Sketch](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-theta.html)\n        * ThetaSketchEstimate\n        * ThetaSketchSetOp\n    * [Tuple Sketch](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-tuple.html)\n        * TupleSketchToEstimate\n        * TupleSketchToEstimateAndBounds\n        * TupleSketchToNumEntries\n        * TupleSketchToMeans\n        * TupleSketchToVariances\n        * TupleSketchToQuantilesSketch\n        * TupleSketchSetOp\n        * TupleSketchTTest\n        * TupleSketchToString\n    * [Quantiles Sketch](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-quantiles.html)\n        * QuantilesSketchToQuantile\n        * QuantilesSketchToQuantiles\n        * QuantilesSketchToHistogram\n        * QuantilesSketchToString\n    * [HLL Sketch](https://druid.apache.org/docs/latest/development/extensions-core/datasketches-hll.html)\n        * HllSketchEstimateWithBounds\n        * HllSketchUnion\n        * HllSketchToString\n\n#### Virtual Columns\n* Expression\n\n#### Granularity\n* Duration\n* Period\n* Predefined\n\nContact\n------\n\nFor any features or bugs, please raise it in issues section\n\nIf anything else, get in touch with us at [opensource@zapr.in](opensource@zapr.in)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzapr-oss%2Fdruidry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzapr-oss%2Fdruidry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzapr-oss%2Fdruidry/lists"}