{"action":"created","comment":{"url":"https://api.github.com/repos/locationtech/geotrellis/pulls/comments/175237369","pull_request_review_id":104744777,"id":175237369,"diff_hunk":"@@ -0,0 +1,195 @@\n+/*\n+ * Copyright 2016 Azavea\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package geotrellis.spark.testkit.io.cog\n+\n+import geotrellis.raster.CellGrid\n+import geotrellis.raster.crop.TileCropMethods\n+import geotrellis.raster.merge.TileMergeMethods\n+import geotrellis.raster.io.geotiff._\n+import geotrellis.raster.io.geotiff.reader.GeoTiffReader\n+import geotrellis.raster.prototype.TilePrototypeMethods\n+import geotrellis.spark._\n+import geotrellis.spark.io._\n+import geotrellis.spark.io.cog._\n+import geotrellis.spark.io.index._\n+import geotrellis.spark.io.json._\n+import geotrellis.spark.testkit.io._\n+import geotrellis.spark.testkit.testfiles.cog.COGTestFiles\n+import geotrellis.util._\n+\n+import org.apache.spark.rdd.RDD\n+import org.scalatest._\n+import spray.json._\n+import spray.json.DefaultJsonProtocol._\n+\n+import scala.reflect._\n+\n+abstract class COGPersistenceSpec[\n+  K: SpatialComponent: Ordering: Boundable: JsonFormat: ClassTag,\n+  V <: CellGrid: GeoTiffReader: ? => TileMergeMethods[V]: ? => TilePrototypeMethods[V]: ? => TileCropMethods[V]: ClassTag: GeoTiffBuilder\n+] extends FunSpec with Matchers with BeforeAndAfterAll {\n+\n+  type TestReader = FilteringCOGLayerReader[LayerId]\n+  type TestWriter = COGLayerWriter\n+  // type TestDeleter = LayerDeleter[LayerId]\n+  // type TestCopier = LayerCopier[LayerId]\n+  // type TestMover = LayerMover[LayerId]\n+  // type TestReindexer = LayerReindexer[LayerId]\n+  type TestTileReader = COGValueReader[LayerId]\n+  // type TestUpdater = LayerUpdater[LayerId]\n+  type TestCollectionReader = COGCollectionLayerReader[LayerId]\n+\n+  def sample: RDD[(K, V)] with Metadata[TileLayerMetadata[K]]\n+  def reader: TestReader\n+  def writer: TestWriter\n+  // def deleter: TestDeleter\n+  // def copier: TestCopier\n+  // def mover: TestMover\n+  // def reindexer: TestReindexer\n+  // def updater: TestUpdater","path":"spark-testkit/src/main/scala/geotrellis/spark/testkit/io/cog/COGPersistenceSpec.scala","position":64,"original_position":63,"commit_id":"1b98948df85d8e0529c591e38cb1e9bf38ec826a","original_commit_id":"91172e1822968cceb66800309aaffa1f9c8b5132","user":{"login":"pomadchin","id":4929546,"avatar_url":"https://avatars3.githubusercontent.com/u/4929546?v=4","gravatar_id":"","url":"https://api.github.com/users/pomadchin","html_url":"https://github.com/pomadchin","followers_url":"https://api.github.com/users/pomadchin/followers","following_url":"https://api.github.com/users/pomadchin/following{/other_user}","gists_url":"https://api.github.com/users/pomadchin/gists{/gist_id}","starred_url":"https://api.github.com/users/pomadchin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pomadchin/subscriptions","organizations_url":"https://api.github.com/users/pomadchin/orgs","repos_url":"https://api.github.com/users/pomadchin/repos","events_url":"https://api.github.com/users/pomadchin/events{/privacy}","received_events_url":"https://api.github.com/users/pomadchin/received_events","type":"User","site_admin":false},"body":"@lossyrob yea, it's done. I'll remove the confusing line than.","created_at":"2018-03-16T23:43:01Z","updated_at":"2018-03-16T23:43:02Z","html_url":"https://github.com/locationtech/geotrellis/pull/2523#discussion_r175237369","pull_request_url":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/comments/175237369"},"html":{"href":"https://github.com/locationtech/geotrellis/pull/2523#discussion_r175237369"},"pull_request":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523"}},"in_reply_to_id":174964066},"pull_request":{"url":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523","id":158800420,"html_url":"https://github.com/locationtech/geotrellis/pull/2523","diff_url":"https://github.com/locationtech/geotrellis/pull/2523.diff","patch_url":"https://github.com/locationtech/geotrellis/pull/2523.patch","issue_url":"https://api.github.com/repos/locationtech/geotrellis/issues/2523","number":2523,"state":"open","locked":false,"title":"WIP: Structured COG Layers","user":{"login":"lossyrob","id":2320142,"avatar_url":"https://avatars1.githubusercontent.com/u/2320142?v=4","gravatar_id":"","url":"https://api.github.com/users/lossyrob","html_url":"https://github.com/lossyrob","followers_url":"https://api.github.com/users/lossyrob/followers","following_url":"https://api.github.com/users/lossyrob/following{/other_user}","gists_url":"https://api.github.com/users/lossyrob/gists{/gist_id}","starred_url":"https://api.github.com/users/lossyrob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lossyrob/subscriptions","organizations_url":"https://api.github.com/users/lossyrob/orgs","repos_url":"https://api.github.com/users/lossyrob/repos","events_url":"https://api.github.com/users/lossyrob/events{/privacy}","received_events_url":"https://api.github.com/users/lossyrob/received_events","type":"User","site_admin":false},"body":"This PR adds structured COG layers to GeoTrellis. Structured COG layers are a replacement for our SinglebandTile and MultibandTile layers for the S3, File and Hadoop backends. It uses Cloud Optimized GeoTiffs instead of Avro-serialized tiles to encode the raster data, and utilizes GeoTiff overviews to store multiple levels of pyramids into a single file. The mechanics are very different, however the API is very similar to the Avro GeoTrellis Layers, and so should be close to a drop-in replacement.\r\n\r\nWork done by @pomadchin, this PR is part of code review/tweaks/merging into master.\r\n\r\nRelates to #2284 \r\nSupersedes #2521","created_at":"2017-12-17T19:46:40Z","updated_at":"2018-03-16T23:43:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"94114f2c9eb63f3c43307b3d3f8993ff648cbbbe","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523/commits","review_comments_url":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523/comments","review_comment_url":"https://api.github.com/repos/locationtech/geotrellis/pulls/comments{/number}","comments_url":"https://api.github.com/repos/locationtech/geotrellis/issues/2523/comments","statuses_url":"https://api.github.com/repos/locationtech/geotrellis/statuses/1b98948df85d8e0529c591e38cb1e9bf38ec826a","head":{"label":"locationtech:feature/gtcog-layer","ref":"feature/gtcog-layer","sha":"1b98948df85d8e0529c591e38cb1e9bf38ec826a","user":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"repo":{"id":3040675,"name":"geotrellis","full_name":"locationtech/geotrellis","owner":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/locationtech/geotrellis","description":"GeoTrellis is a geographic data processing engine for high performance applications.","fork":false,"url":"https://api.github.com/repos/locationtech/geotrellis","forks_url":"https://api.github.com/repos/locationtech/geotrellis/forks","keys_url":"https://api.github.com/repos/locationtech/geotrellis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/locationtech/geotrellis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/locationtech/geotrellis/teams","hooks_url":"https://api.github.com/repos/locationtech/geotrellis/hooks","issue_events_url":"https://api.github.com/repos/locationtech/geotrellis/issues/events{/number}","events_url":"https://api.github.com/repos/locationtech/geotrellis/events","assignees_url":"https://api.github.com/repos/locationtech/geotrellis/assignees{/user}","branches_url":"https://api.github.com/repos/locationtech/geotrellis/branches{/branch}","tags_url":"https://api.github.com/repos/locationtech/geotrellis/tags","blobs_url":"https://api.github.com/repos/locationtech/geotrellis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/locationtech/geotrellis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/locationtech/geotrellis/git/refs{/sha}","trees_url":"https://api.github.com/repos/locationtech/geotrellis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/locationtech/geotrellis/statuses/{sha}","languages_url":"https://api.github.com/repos/locationtech/geotrellis/languages","stargazers_url":"https://api.github.com/repos/locationtech/geotrellis/stargazers","contributors_url":"https://api.github.com/repos/locationtech/geotrellis/contributors","subscribers_url":"https://api.github.com/repos/locationtech/geotrellis/subscribers","subscription_url":"https://api.github.com/repos/locationtech/geotrellis/subscription","commits_url":"https://api.github.com/repos/locationtech/geotrellis/commits{/sha}","git_commits_url":"https://api.github.com/repos/locationtech/geotrellis/git/commits{/sha}","comments_url":"https://api.github.com/repos/locationtech/geotrellis/comments{/number}","issue_comment_url":"https://api.github.com/repos/locationtech/geotrellis/issues/comments{/number}","contents_url":"https://api.github.com/repos/locationtech/geotrellis/contents/{+path}","compare_url":"https://api.github.com/repos/locationtech/geotrellis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/locationtech/geotrellis/merges","archive_url":"https://api.github.com/repos/locationtech/geotrellis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/locationtech/geotrellis/downloads","issues_url":"https://api.github.com/repos/locationtech/geotrellis/issues{/number}","pulls_url":"https://api.github.com/repos/locationtech/geotrellis/pulls{/number}","milestones_url":"https://api.github.com/repos/locationtech/geotrellis/milestones{/number}","notifications_url":"https://api.github.com/repos/locationtech/geotrellis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/locationtech/geotrellis/labels{/name}","releases_url":"https://api.github.com/repos/locationtech/geotrellis/releases{/id}","deployments_url":"https://api.github.com/repos/locationtech/geotrellis/deployments","created_at":"2011-12-23T14:56:54Z","updated_at":"2018-03-15T08:51:15Z","pushed_at":"2018-03-16T12:00:02Z","git_url":"git://github.com/locationtech/geotrellis.git","ssh_url":"git@github.com:locationtech/geotrellis.git","clone_url":"https://github.com/locationtech/geotrellis.git","svn_url":"https://github.com/locationtech/geotrellis","homepage":"http://geotrellis.io","size":523852,"stargazers_count":656,"watchers_count":656,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":211,"mirror_url":null,"archived":false,"open_issues_count":142,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":211,"open_issues":142,"watchers":656,"default_branch":"master"}},"base":{"label":"locationtech:master","ref":"master","sha":"bcc92d7dc75213d8472f3e27284cd4b6107a9925","user":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"repo":{"id":3040675,"name":"geotrellis","full_name":"locationtech/geotrellis","owner":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/locationtech/geotrellis","description":"GeoTrellis is a geographic data processing engine for high performance applications.","fork":false,"url":"https://api.github.com/repos/locationtech/geotrellis","forks_url":"https://api.github.com/repos/locationtech/geotrellis/forks","keys_url":"https://api.github.com/repos/locationtech/geotrellis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/locationtech/geotrellis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/locationtech/geotrellis/teams","hooks_url":"https://api.github.com/repos/locationtech/geotrellis/hooks","issue_events_url":"https://api.github.com/repos/locationtech/geotrellis/issues/events{/number}","events_url":"https://api.github.com/repos/locationtech/geotrellis/events","assignees_url":"https://api.github.com/repos/locationtech/geotrellis/assignees{/user}","branches_url":"https://api.github.com/repos/locationtech/geotrellis/branches{/branch}","tags_url":"https://api.github.com/repos/locationtech/geotrellis/tags","blobs_url":"https://api.github.com/repos/locationtech/geotrellis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/locationtech/geotrellis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/locationtech/geotrellis/git/refs{/sha}","trees_url":"https://api.github.com/repos/locationtech/geotrellis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/locationtech/geotrellis/statuses/{sha}","languages_url":"https://api.github.com/repos/locationtech/geotrellis/languages","stargazers_url":"https://api.github.com/repos/locationtech/geotrellis/stargazers","contributors_url":"https://api.github.com/repos/locationtech/geotrellis/contributors","subscribers_url":"https://api.github.com/repos/locationtech/geotrellis/subscribers","subscription_url":"https://api.github.com/repos/locationtech/geotrellis/subscription","commits_url":"https://api.github.com/repos/locationtech/geotrellis/commits{/sha}","git_commits_url":"https://api.github.com/repos/locationtech/geotrellis/git/commits{/sha}","comments_url":"https://api.github.com/repos/locationtech/geotrellis/comments{/number}","issue_comment_url":"https://api.github.com/repos/locationtech/geotrellis/issues/comments{/number}","contents_url":"https://api.github.com/repos/locationtech/geotrellis/contents/{+path}","compare_url":"https://api.github.com/repos/locationtech/geotrellis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/locationtech/geotrellis/merges","archive_url":"https://api.github.com/repos/locationtech/geotrellis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/locationtech/geotrellis/downloads","issues_url":"https://api.github.com/repos/locationtech/geotrellis/issues{/number}","pulls_url":"https://api.github.com/repos/locationtech/geotrellis/pulls{/number}","milestones_url":"https://api.github.com/repos/locationtech/geotrellis/milestones{/number}","notifications_url":"https://api.github.com/repos/locationtech/geotrellis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/locationtech/geotrellis/labels{/name}","releases_url":"https://api.github.com/repos/locationtech/geotrellis/releases{/id}","deployments_url":"https://api.github.com/repos/locationtech/geotrellis/deployments","created_at":"2011-12-23T14:56:54Z","updated_at":"2018-03-15T08:51:15Z","pushed_at":"2018-03-16T12:00:02Z","git_url":"git://github.com/locationtech/geotrellis.git","ssh_url":"git@github.com:locationtech/geotrellis.git","clone_url":"https://github.com/locationtech/geotrellis.git","svn_url":"https://github.com/locationtech/geotrellis","homepage":"http://geotrellis.io","size":523852,"stargazers_count":656,"watchers_count":656,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":211,"mirror_url":null,"archived":false,"open_issues_count":142,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":211,"open_issues":142,"watchers":656,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523"},"html":{"href":"https://github.com/locationtech/geotrellis/pull/2523"},"issue":{"href":"https://api.github.com/repos/locationtech/geotrellis/issues/2523"},"comments":{"href":"https://api.github.com/repos/locationtech/geotrellis/issues/2523/comments"},"review_comments":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523/comments"},"review_comment":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/locationtech/geotrellis/pulls/2523/commits"},"statuses":{"href":"https://api.github.com/repos/locationtech/geotrellis/statuses/1b98948df85d8e0529c591e38cb1e9bf38ec826a"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"pomadchin"}}