payload: {"action":"created","comment":{"url":"https://api.github.com/repos/hyrise/hyrise/pulls/comments/273836268","pull_request_review_id":224805424,"id":273836268,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI3MzgzNjI2OA==","diff_hunk":"@@ -20,6 +21,7 @@ struct OperatorJoinPredicate {\n   static std::optional<OperatorJoinPredicate> from_expression(const AbstractExpression& predicate,\n                                                               const AbstractLQPNode& left_input,\n                                                               const AbstractLQPNode& right_input);\n+  static std::optional<OperatorJoinPredicate> from_join_node(const JoinNode& join_node);","path":"src/lib/operators/operator_join_predicate.hpp","position":12,"original_position":12,"commit_id":"0bf10d82a9b1948417eea5d3732b90c547ae6efd","original_commit_id":"0bf10d82a9b1948417eea5d3732b90c547ae6efd","user":{"login":"mrks","id":575106,"node_id":"MDQ6VXNlcjU3NTEwNg==","avatar_url":"https://avatars2.githubusercontent.com/u/575106?v=4","gravatar_id":"","url":"https://api.github.com/users/mrks","html_url":"https://github.com/mrks","followers_url":"https://api.github.com/users/mrks/followers","following_url":"https://api.github.com/users/mrks/following{/other_user}","gists_url":"https://api.github.com/users/mrks/gists{/gist_id}","starred_url":"https://api.github.com/users/mrks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrks/subscriptions","organizations_url":"https://api.github.com/users/mrks/orgs","repos_url":"https://api.github.com/users/mrks/repos","events_url":"https://api.github.com/users/mrks/events{/privacy}","received_events_url":"https://api.github.com/users/mrks/received_events","type":"User","site_admin":false},"body":"?","created_at":"2019-04-10T08:08:49Z","updated_at":"2019-04-10T08:49:46Z","html_url":"https://github.com/hyrise/hyrise/pull/1489#discussion_r273836268","pull_request_url":"https://api.github.com/repos/hyrise/hyrise/pulls/1489","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/comments/273836268"},"html":{"href":"https://github.com/hyrise/hyrise/pull/1489#discussion_r273836268"},"pull_request":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/1489"}}},"pull_request":{"url":"https://api.github.com/repos/hyrise/hyrise/pulls/1489","id":251930124,"node_id":"MDExOlB1bGxSZXF1ZXN0MjUxOTMwMTI0","html_url":"https://github.com/hyrise/hyrise/pull/1489","diff_url":"https://github.com/hyrise/hyrise/pull/1489.diff","patch_url":"https://github.com/hyrise/hyrise/pull/1489.patch","issue_url":"https://api.github.com/repos/hyrise/hyrise/issues/1489","number":1489,"state":"open","locked":false,"title":"CardinalityEstimator utilizing Histograms","user":{"login":"mrzzzrm","id":2679018,"node_id":"MDQ6VXNlcjI2NzkwMTg=","avatar_url":"https://avatars3.githubusercontent.com/u/2679018?v=4","gravatar_id":"","url":"https://api.github.com/users/mrzzzrm","html_url":"https://github.com/mrzzzrm","followers_url":"https://api.github.com/users/mrzzzrm/followers","following_url":"https://api.github.com/users/mrzzzrm/following{/other_user}","gists_url":"https://api.github.com/users/mrzzzrm/gists{/gist_id}","starred_url":"https://api.github.com/users/mrzzzrm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrzzzrm/subscriptions","organizations_url":"https://api.github.com/users/mrzzzrm/orgs","repos_url":"https://api.github.com/users/mrzzzrm/repos","events_url":"https://api.github.com/users/mrzzzrm/events{/privacy}","received_events_url":"https://api.github.com/users/mrzzzrm/received_events","type":"User","site_admin":false},"body":"Replaces the old cardinality estimation paths via `AbstractLQPNode::derive_statistics_from` with a dedicated `CardinalityEstimator` component. This cardinality estimator works primarily with Histograms spanning entire columns (as opposed to per-segment histograms). Inner Join and Scan operations are estimated more accurately than before. Scans on string columns are estimated reasonably well for the first time, thanks to @timzimmermann. This really helps in the Join Order Benchmark, which has many local predicates on string colums.\r\n\r\n* Removes the `EqualWidthHistogram` and `EqualHeightHistogram` (for now), as we only actively use the `EqualDistinctCountHistogram`.\r\n* The old cardinality estimation system had specialized code paths for Outer and Semi Joins - this functionality was removed, mainly, to reduce the amount of code to port over, test and maintain. Outer Joins are now estimated just like inner Joins and Semi/Anti Joins have a selectivity of 1. We don't \"need\" estimations for these join types anyway, right now. \r\n* We currently generate 5 (for < 10'000 rows) to 100 (for >= 20'000'000 rows) Bins. These numbers are rather arbitrarily chosen. More bins mean poorer optimization performance (esp for Joins), but as our error margins are measured in factors, it's probably not worth allocating more bins and hope for better optimization results.\r\n\r\n\r\n### Open architectural discussions\r\n* The interface of `AbstractHistogram` feels overly large especially caused by the Histograms supporting both pruning and cardinality estimation. I'll discuss with @Bouncner whether we actually need pruning capabilities in the histograms. Shouldn't block this PR and can be improved in subsequent one.\r\n* The slot system in `ColumnStatistics` requires manual extension in multiple methods everytime a statistics object type is added\r\n\r\n### Benchmark results\r\n[Join Order Benchmark](https://gist.github.com/mrzzzrm/cd45479951e44403e3843bcc44732057) improves nicely, which imo is the best argument for the usefulness of this CardinalityEstimator.\r\n[TPC-H with prepared statements](https://gist.github.com/mrzzzrm/4033bd2217148876366a1d65ecca5f15) never hits the Query Cache and therefore profits a bit from the reduced optimization times.\r\n\r\nFix #1153\r\nFix #1513 \r\nFix #1310 ","created_at":"2019-02-11T14:19:19Z","updated_at":"2019-04-10T08:49:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1ac3ed7692ecb21d8152459cec68ffd4f3f76b6f","assignee":null,"assignees":[],"requested_reviewers":[{"login":"Bouncner","id":1745857,"node_id":"MDQ6VXNlcjE3NDU4NTc=","avatar_url":"https://avatars2.githubusercontent.com/u/1745857?v=4","gravatar_id":"","url":"https://api.github.com/users/Bouncner","html_url":"https://github.com/Bouncner","followers_url":"https://api.github.com/users/Bouncner/followers","following_url":"https://api.github.com/users/Bouncner/following{/other_user}","gists_url":"https://api.github.com/users/Bouncner/gists{/gist_id}","starred_url":"https://api.github.com/users/Bouncner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bouncner/subscriptions","organizations_url":"https://api.github.com/users/Bouncner/orgs","repos_url":"https://api.github.com/users/Bouncner/repos","events_url":"https://api.github.com/users/Bouncner/events{/privacy}","received_events_url":"https://api.github.com/users/Bouncner/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":978421305,"node_id":"MDU6TGFiZWw5Nzg0MjEzMDU=","url":"https://api.github.com/repos/hyrise/hyrise/labels/FullCI","name":"FullCI","color":"02ef0e","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/hyrise/hyrise/pulls/1489/commits","review_comments_url":"https://api.github.com/repos/hyrise/hyrise/pulls/1489/comments","review_comment_url":"https://api.github.com/repos/hyrise/hyrise/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hyrise/hyrise/issues/1489/comments","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/0bf10d82a9b1948417eea5d3732b90c547ae6efd","head":{"label":"hyrise:feature/cardinality_estimator_lenient_histograms","ref":"feature/cardinality_estimator_lenient_histograms","sha":"0bf10d82a9b1948417eea5d3732b90c547ae6efd","user":{"login":"hyrise","id":3465095,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NjUwOTU=","avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"repo":{"id":87414843,"node_id":"MDEwOlJlcG9zaXRvcnk4NzQxNDg0Mw==","name":"hyrise","full_name":"hyrise/hyrise","private":false,"owner":{"login":"hyrise","id":3465095,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NjUwOTU=","avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/hyrise/hyrise","description":"Hyrise is a research in-memory database.","fork":false,"url":"https://api.github.com/repos/hyrise/hyrise","forks_url":"https://api.github.com/repos/hyrise/hyrise/forks","keys_url":"https://api.github.com/repos/hyrise/hyrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyrise/hyrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyrise/hyrise/teams","hooks_url":"https://api.github.com/repos/hyrise/hyrise/hooks","issue_events_url":"https://api.github.com/repos/hyrise/hyrise/issues/events{/number}","events_url":"https://api.github.com/repos/hyrise/hyrise/events","assignees_url":"https://api.github.com/repos/hyrise/hyrise/assignees{/user}","branches_url":"https://api.github.com/repos/hyrise/hyrise/branches{/branch}","tags_url":"https://api.github.com/repos/hyrise/hyrise/tags","blobs_url":"https://api.github.com/repos/hyrise/hyrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyrise/hyrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyrise/hyrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyrise/hyrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/{sha}","languages_url":"https://api.github.com/repos/hyrise/hyrise/languages","stargazers_url":"https://api.github.com/repos/hyrise/hyrise/stargazers","contributors_url":"https://api.github.com/repos/hyrise/hyrise/contributors","subscribers_url":"https://api.github.com/repos/hyrise/hyrise/subscribers","subscription_url":"https://api.github.com/repos/hyrise/hyrise/subscription","commits_url":"https://api.github.com/repos/hyrise/hyrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyrise/hyrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyrise/hyrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyrise/hyrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyrise/hyrise/contents/{+path}","compare_url":"https://api.github.com/repos/hyrise/hyrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyrise/hyrise/merges","archive_url":"https://api.github.com/repos/hyrise/hyrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyrise/hyrise/downloads","issues_url":"https://api.github.com/repos/hyrise/hyrise/issues{/number}","pulls_url":"https://api.github.com/repos/hyrise/hyrise/pulls{/number}","milestones_url":"https://api.github.com/repos/hyrise/hyrise/milestones{/number}","notifications_url":"https://api.github.com/repos/hyrise/hyrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyrise/hyrise/labels{/name}","releases_url":"https://api.github.com/repos/hyrise/hyrise/releases{/id}","deployments_url":"https://api.github.com/repos/hyrise/hyrise/deployments","created_at":"2017-04-06T10:03:31Z","updated_at":"2019-04-09T19:53:01Z","pushed_at":"2019-04-09T20:03:53Z","git_url":"git://github.com/hyrise/hyrise.git","ssh_url":"git@github.com:hyrise/hyrise.git","clone_url":"https://github.com/hyrise/hyrise.git","svn_url":"https://github.com/hyrise/hyrise","homepage":"https://hpi.de/plattner/projects/hyrise.html","size":21169,"stargazers_count":204,"watchers_count":204,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":48,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":99,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":48,"open_issues":99,"watchers":204,"default_branch":"master"}},"base":{"label":"hyrise:master","ref":"master","sha":"95561eca450cac55abc696e0c74be01bd68998ac","user":{"login":"hyrise","id":3465095,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NjUwOTU=","avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"repo":{"id":87414843,"node_id":"MDEwOlJlcG9zaXRvcnk4NzQxNDg0Mw==","name":"hyrise","full_name":"hyrise/hyrise","private":false,"owner":{"login":"hyrise","id":3465095,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NjUwOTU=","avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/hyrise/hyrise","description":"Hyrise is a research in-memory database.","fork":false,"url":"https://api.github.com/repos/hyrise/hyrise","forks_url":"https://api.github.com/repos/hyrise/hyrise/forks","keys_url":"https://api.github.com/repos/hyrise/hyrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyrise/hyrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyrise/hyrise/teams","hooks_url":"https://api.github.com/repos/hyrise/hyrise/hooks","issue_events_url":"https://api.github.com/repos/hyrise/hyrise/issues/events{/number}","events_url":"https://api.github.com/repos/hyrise/hyrise/events","assignees_url":"https://api.github.com/repos/hyrise/hyrise/assignees{/user}","branches_url":"https://api.github.com/repos/hyrise/hyrise/branches{/branch}","tags_url":"https://api.github.com/repos/hyrise/hyrise/tags","blobs_url":"https://api.github.com/repos/hyrise/hyrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyrise/hyrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyrise/hyrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyrise/hyrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/{sha}","languages_url":"https://api.github.com/repos/hyrise/hyrise/languages","stargazers_url":"https://api.github.com/repos/hyrise/hyrise/stargazers","contributors_url":"https://api.github.com/repos/hyrise/hyrise/contributors","subscribers_url":"https://api.github.com/repos/hyrise/hyrise/subscribers","subscription_url":"https://api.github.com/repos/hyrise/hyrise/subscription","commits_url":"https://api.github.com/repos/hyrise/hyrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyrise/hyrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyrise/hyrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyrise/hyrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyrise/hyrise/contents/{+path}","compare_url":"https://api.github.com/repos/hyrise/hyrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyrise/hyrise/merges","archive_url":"https://api.github.com/repos/hyrise/hyrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyrise/hyrise/downloads","issues_url":"https://api.github.com/repos/hyrise/hyrise/issues{/number}","pulls_url":"https://api.github.com/repos/hyrise/hyrise/pulls{/number}","milestones_url":"https://api.github.com/repos/hyrise/hyrise/milestones{/number}","notifications_url":"https://api.github.com/repos/hyrise/hyrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyrise/hyrise/labels{/name}","releases_url":"https://api.github.com/repos/hyrise/hyrise/releases{/id}","deployments_url":"https://api.github.com/repos/hyrise/hyrise/deployments","created_at":"2017-04-06T10:03:31Z","updated_at":"2019-04-09T19:53:01Z","pushed_at":"2019-04-09T20:03:53Z","git_url":"git://github.com/hyrise/hyrise.git","ssh_url":"git@github.com:hyrise/hyrise.git","clone_url":"https://github.com/hyrise/hyrise.git","svn_url":"https://github.com/hyrise/hyrise","homepage":"https://hpi.de/plattner/projects/hyrise.html","size":21169,"stargazers_count":204,"watchers_count":204,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":48,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":99,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":48,"open_issues":99,"watchers":204,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/1489"},"html":{"href":"https://github.com/hyrise/hyrise/pull/1489"},"issue":{"href":"https://api.github.com/repos/hyrise/hyrise/issues/1489"},"comments":{"href":"https://api.github.com/repos/hyrise/hyrise/issues/1489/comments"},"review_comments":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/1489/comments"},"review_comment":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/1489/commits"},"statuses":{"href":"https://api.github.com/repos/hyrise/hyrise/statuses/0bf10d82a9b1948417eea5d3732b90c547ae6efd"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"mrks"}}