{"id":7378,"date":"2015-06-01T19:46:06","date_gmt":"2015-06-01T10:46:06","guid":{"rendered":"http:\/\/www.techscore.com\/blog\/?p=7378"},"modified":"2018-11-14T16:33:48","modified_gmt":"2018-11-14T07:33:48","slug":"presto-connector-development-2","status":"publish","type":"post","link":"https:\/\/www.techscore.com\/blog\/2015\/06\/01\/presto-connector-development-2\/","title":{"rendered":"Presto \u30b3\u30cd\u30af\u30bf\u30fc\u3092\u5b9f\u88c5\u3059\u308b \u7b2c\u4e8c\u56de"},"content":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3002\u677e\u672c\u3067\u3059\u3002<\/p>\n<p><a href=\"http:\/\/www.techscore.com\/blog\/2015\/04\/30\/presto-connector-development-1\/\" title=\"Presto \u30b3\u30cd\u30af\u30bf\u30fc\u3092\u5b9f\u88c5\u3059\u308b \u7b2c\u4e00\u56de | TECHSCORE BLOG\">\u524d\u56de<\/a>\u306b\u7d9a\u304d\u3001Presto \u306e\u30b3\u30cd\u30af\u30bf\u30fc\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002\u7b2c\u4e8c\u56de\u306e\u4eca\u56de\u306f\u30c6\u30fc\u30d6\u30eb\u306e\u30cf\u30f3\u30c9\u30eb\u30af\u30e9\u30b9\u3084\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u64cd\u4f5c\u3059\u308b\u30af\u30e9\u30b9\u3092\u6271\u3044\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u88c5\u3059\u308b\u4e3b\u306a\u30af\u30e9\u30b9\u306f\u6b21\u306e 4 \u3064\u3067\u3059\u3002<\/p>\n<ul>\n<li><strong>TechscoreColumnHandle<\/strong> implements com.facebook.presto.spi.ConnectorColumnHandle<\/li>\n<li><strong>TechscoreTableHandle<\/strong> implements com.facebook.presto.spi.ConnectorTableHandle<\/li>\n<li><strong>TechscoreHandleResolver<\/strong> implements com.facebook.presto.spi.ConnectorHandleResolver<\/li>\n<li><strong>TechscoreMetadata<\/strong> extends com.facebook.presto.spi.ReadOnlyConnectorMetadata<\/li>\n<\/ul>\n<h2>\u30cf\u30f3\u30c9\u30eb\u30af\u30e9\u30b9<\/h2>\n<p>Presto \u30b3\u30cd\u30af\u30bf\u30fc\u3067\u306f\u3001<a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorTableHandle.java\" target=\"_blank\"><code>ConnectorTableHandle<\/code><\/a> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3068 <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorColumnHandle.java\" target=\"_blank\"><code>ConnectorColumnHandle<\/code><\/a> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3092\u4f7f\u3063\u3066\u3001\u30c6\u30fc\u30d6\u30eb\u3084\u30ab\u30e9\u30e0\u3092\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3057\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u306f\u30ab\u30e9\u30e0\u30cf\u30f3\u30c9\u30eb\u3002<\/p>\n<h3>com.techscore.example.presto.plugin.TechscoreColumnHandle<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport lombok.EqualsAndHashCode;\r\nimport lombok.NonNull;\r\nimport lombok.ToString;\r\n\r\nimport com.facebook.presto.spi.ColumnMetadata;\r\nimport com.facebook.presto.spi.ConnectorColumnHandle;\r\nimport com.facebook.presto.spi.type.Type;\r\nimport com.fasterxml.jackson.annotation.JsonCreator;\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\nimport com.fasterxml.jackson.annotation.JsonProperty;\r\nimport com.google.common.primitives.Ints;\r\n\r\n@EqualsAndHashCode\r\n@ToString\r\npublic class TechscoreColumnHandle implements ConnectorColumnHandle, Comparable<TechscoreColumnHandle> {\r\n\r\n    private final String connectorId;\r\n    private final String caseSensitiveName;\r\n    private final String name;\r\n    private final Type type;\r\n    private final int ordinalPosition;\r\n\r\n    @JsonCreator\r\n    public TechscoreColumnHandle(\r\n            @JsonProperty(\"connectorId\") @NonNull String connectorId,\r\n            @JsonProperty(\"caseSensitiveName\") @NonNull String caseSensitiveName,\r\n            @JsonProperty(\"type\") @NonNull Type type,\r\n            @JsonProperty(\"ordinalPosition\") int ordinalPosition) {\r\n        this.connectorId = connectorId;\r\n        this.caseSensitiveName = caseSensitiveName;\r\n        this.name = caseSensitiveName.toLowerCase();\r\n        this.type = type;\r\n        this.ordinalPosition = ordinalPosition;\r\n    }\r\n\r\n    @JsonProperty\r\n    public String getConnectorId() {\r\n        return connectorId;\r\n    }\r\n\r\n    @JsonProperty\r\n    public String getCaseSensitiveName() {\r\n        return caseSensitiveName;\r\n    }\r\n\r\n    @JsonIgnore\r\n    public String getName() {\r\n        return name;\r\n    }\r\n\r\n    @JsonProperty\r\n    public Type getType() {\r\n        return type;\r\n    }\r\n\r\n    @JsonProperty\r\n    public int getOrdinalPosition() {\r\n        return ordinalPosition;\r\n    }\r\n\r\n    public ColumnMetadata toColumnMetadata() {\r\n        return new ColumnMetadata(getName(), getType(), getOrdinalPosition(), false);\r\n    }\r\n\r\n    @Override\r\n    public int compareTo(TechscoreColumnHandle otherHandle) {\r\n        return Ints.compare(getOrdinalPosition(), otherHandle.getOrdinalPosition());\r\n    }\r\n}\r\n<\/pre>\n<p><code>ConnectorColumnHandle<\/code> \u5b9f\u88c5\u30af\u30e9\u30b9\u306f\u3001\u30b3\u30cd\u30af\u30bf\u30fc\u5185\u3067\u30ab\u30e9\u30e0\u3092\u6271\u3044\u3084\u3059\u3044\u3088\u3046\u597d\u304d\u306b\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\u3068\u3057\u3066\u3001Presto \u672c\u4f53\u5074\u3067\u672c\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u308b\u3088\u3046\u3001<code>@JsonCreator<\/code> \u3084 <code>@JsonProperty<\/code> \u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u3066 JSON \u3067\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\uff0f\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3092\u53ef\u80fd\u3068\u3059\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n<p>Presto \u3067\u306f\u30b1\u30fc\u30b9\u7121\u8996\u3067\u30ab\u30e9\u30e0\u540d\u304c\u6271\u308f\u308c\u308b\u70ba\u3001<code>caseSensitiveName<\/code> \u3067\u6e21\u3055\u308c\u305f\u30ab\u30e9\u30e0\u540d\u3092\u5c0f\u6587\u5b57\u5316\u3057\u305f <code>name<\/code> \u30d7\u30ed\u30d1\u30c6\u30a3\u3082\u6301\u3064\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"lang:java decode:true\">\r\n        this.name = caseSensitiveName.toLowerCase();\r\n<\/pre>\n<p><code>type<\/code> \u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30ab\u30e9\u30e0\u306e\u30c7\u30fc\u30bf\u578b\u3092\u8868\u3059\u30af\u30e9\u30b9\u3067\u3001<code><a href=\"https:\/\/github.com\/facebook\/presto\/tree\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\" target=\"_blank\">com.facebook.presto.spi.type<\/a><\/code> \u30d1\u30c3\u30b1\u30fc\u30b8\u5185\u306b\u57fa\u672c\u7684\u306a\u30c7\u30fc\u30bf\u578b\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u4e3b\u306a\u30c7\u30fc\u30bf\u578b\u3067\u3059\u3002<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/BigintType.java#L26\" target=\"_blank\">BigintType.BIGINT<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/BooleanType.java#L26\" target=\"_blank\">BooleanType.BOOLEAN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/DateType.java#L34\" target=\"_blank\">DateType.DATE<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/DoubleType.java#L26\" target=\"_blank\">DoubleType.DOUBLE<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/TimestampType.java#L30\" target=\"_blank\">TimestampType.TIMESTAMP<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/type\/VarcharType.java#L30\" target=\"_blank\">VarcharType VARCHAR<\/a><\/li>\n<\/ul>\n<p><code>ordinalPosition<\/code> \u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30c6\u30fc\u30d6\u30eb\u5185\u3067\u306e\u3053\u306e\u30ab\u30e9\u30e0\u306e\u9806\u5e8f\u3092\u8868\u3057\u307e\u3059\u3002\u3053\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306f Presto \u304c\u4f7f\u7528\u3059\u308b\u30ab\u30e9\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf\u30af\u30e9\u30b9\u3067\u3042\u308b <code>ColumnMetadata<\/code> \u306b\u3082\u5f15\u304d\u7d99\u304c\u308c\u3001<code>SELECT *<\/code> \u7b49\u3067 SQL \u304c\u767a\u884c\u3055\u308c\u305f\u5834\u5408\u306e\u30ab\u30e9\u30e0\u306e\u4e26\u3073\u9806\u3068\u3057\u3066\u5229\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u6700\u7d42\u7684\u306b\u3001\u3053\u308c\u3089\u306e\u60c5\u5831\u3092\u4f7f\u3044 <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ColumnMetadata.java\" target=\"_blank\"><code>ColumnMetadata<\/code><\/a> \u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u30c6\u30fc\u30d6\u30eb\u30cf\u30f3\u30c9\u30eb\u3002<\/p>\n<h3>com.techscore.example.presto.plugin.TechscoreTableHandle<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport lombok.EqualsAndHashCode;\r\nimport lombok.NonNull;\r\nimport lombok.ToString;\r\n\r\nimport com.facebook.presto.spi.ConnectorTableHandle;\r\nimport com.facebook.presto.spi.SchemaTableName;\r\nimport com.fasterxml.jackson.annotation.JsonCreator;\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\nimport com.fasterxml.jackson.annotation.JsonProperty;\r\n\r\n@EqualsAndHashCode\r\n@ToString\r\npublic class TechscoreTableHandle implements ConnectorTableHandle {\r\n\r\n    private final String connectorId;\r\n    private final SchemaTableName schemaTableName;\r\n\r\n    @JsonCreator\r\n    public TechscoreTableHandle(\r\n            @JsonProperty(\"connectorId\") @NonNull String connectorId,\r\n            @JsonProperty(\"schemaTableName\") @NonNull SchemaTableName schemaTableName) {\r\n        this.connectorId = connectorId;\r\n        this.schemaTableName = schemaTableName;\r\n    }\r\n\r\n    @JsonProperty\r\n    public String getConnectorId() {\r\n        return connectorId;\r\n    }\r\n\r\n    @JsonProperty\r\n    public SchemaTableName getSchemaTableName() {\r\n        return schemaTableName;\r\n    }\r\n\r\n    @JsonIgnore\r\n    public String getSchemaName() {\r\n        return getSchemaTableName().getSchemaName();\r\n    }\r\n\r\n    @JsonIgnore\r\n    public String getTableName() {\r\n        return getSchemaTableName().getTableName();\r\n    }\r\n}\r\n<\/pre>\n<p><code>ConnectorTableHandle<\/code> \u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3082\u3001\u30b3\u30cd\u30af\u30bf\u30fc\u5185\u3067\u30c6\u30fc\u30d6\u30eb\u60c5\u5831\u304c\u6271\u3044\u3084\u3059\u3044\u3088\u3046\u597d\u304d\u306b\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u5b9f\u88c5\u3067\u306f <code>connectorId<\/code> \u3068 <code>SchemaTableName<\/code> \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6301\u3064\u3060\u3051\u3068\u3057\u3066\u3044\u307e\u3059\u3002<a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/SchemaTableName.java\" target=\"_blank\"><code>SchemaTableName<\/code><\/a> \u306f\u305d\u306e\u540d\u306e\u901a\u308a\u5bfe\u8c61\u30c6\u30fc\u30d6\u30eb\u306e\u30b9\u30ad\u30fc\u30de\u540d\u3068\u30c6\u30fc\u30d6\u30eb\u540d\u3092\u6301\u3064\u30af\u30e9\u30b9\u3067\u3059\u3002<\/p>\n<p>\u3053\u3061\u3089\u3082 <code>TechscoreColumnHandle<\/code> \u540c\u69d8\u3001JSON \u3067\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\uff0f\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u304c\u53ef\u80fd\u306b\u306a\u308b\u3088\u3046\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4ed8\u3051\u3066\u3044\u307e\u3059\u3002<code>TechscoreTableHandle<\/code> \u3067\u306f JSON \u3067\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5316\u3092\u898b\u8fbc\u3093\u3067\u3001\u3042\u307e\u308a\u30d5\u30a1\u30c3\u30c8\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u306a\u3089\u306a\u3044\u3088\u3046\u8003\u616e\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>com.techscore.example.presto.plugin.TechscoreHandleResolver<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport static com.google.common.base.Preconditions.checkArgument;\r\n\r\nimport javax.inject.Inject;\r\n\r\nimport lombok.NonNull;\r\nimport lombok.Value;\r\n\r\nimport com.facebook.presto.spi.ConnectorColumnHandle;\r\nimport com.facebook.presto.spi.ConnectorHandleResolver;\r\nimport com.facebook.presto.spi.ConnectorIndexHandle;\r\nimport com.facebook.presto.spi.ConnectorInsertTableHandle;\r\nimport com.facebook.presto.spi.ConnectorOutputTableHandle;\r\nimport com.facebook.presto.spi.ConnectorSplit;\r\nimport com.facebook.presto.spi.ConnectorTableHandle;\r\nimport com.google.inject.name.Named;\r\n\r\n@Value\r\npublic class TechscoreHandleResolver implements ConnectorHandleResolver {\r\n\r\n    private final String connectorId;\r\n\r\n    @Inject\r\n    TechscoreHandleResolver(@Named(\"connectorId\") @NonNull String connectorId) {\r\n        this.connectorId = connectorId;\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorTableHandle tableHandle) {\r\n        return tableHandle != null && tableHandle instanceof TechscoreTableHandle\r\n                && getConnectorId().equals(((TechscoreTableHandle) tableHandle).getConnectorId());\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorColumnHandle columnHandle) {\r\n        return columnHandle != null && columnHandle instanceof TechscoreColumnHandle\r\n                && getConnectorId().equals(((TechscoreColumnHandle) columnHandle).getConnectorId());\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorSplit split) {\r\n        return split != null && split instanceof TechscoreSplit\r\n                && getConnectorId().equals(((TechscoreSplit) split).getConnectorId());\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorIndexHandle indexHandle) {\r\n        return false;\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorOutputTableHandle tableHandle) {\r\n        return false;\r\n    }\r\n\r\n    @Override\r\n    public boolean canHandle(ConnectorInsertTableHandle tableHandle) {\r\n        return false;\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorTableHandle> getTableHandleClass() {\r\n        return TechscoreTableHandle.class;\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorColumnHandle> getColumnHandleClass() {\r\n        return TechscoreColumnHandle.class;\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorSplit> getSplitClass() {\r\n        return TechscoreSplit.class;\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorIndexHandle> getIndexHandleClass() {\r\n        throw new UnsupportedOperationException();\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorOutputTableHandle> getOutputTableHandleClass() {\r\n        throw new UnsupportedOperationException();\r\n    }\r\n\r\n    @Override\r\n    public Class<? extends ConnectorInsertTableHandle> getInsertTableHandleClass() {\r\n        throw new UnsupportedOperationException();\r\n    }\r\n\r\n    TechscoreTableHandle convertTableHandle(ConnectorTableHandle tableHandle) {\r\n        checkArgument(canHandle(tableHandle));\r\n        return (TechscoreTableHandle) tableHandle;\r\n    }\r\n\r\n    TechscoreColumnHandle convertColumnHandle(ConnectorColumnHandle columnHandle) {\r\n        checkArgument(canHandle(columnHandle));\r\n        return (TechscoreColumnHandle) columnHandle;\r\n    }\r\n\r\n    TechscoreSplit convertSplit(ConnectorSplit split) {\r\n        checkArgument(canHandle(split));\r\n        return (TechscoreSplit) split;\r\n    }\r\n}\r\n<\/pre>\n<p><code>ConnectorHandleResulver<\/code> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u306f\u3053\u3093\u306a\u3082\u306e\u3068\u898b\u3066\u9802\u3051\u3070\u5341\u5206\u3067\u3059\u3002\u5404\u7a2e\u30cf\u30f3\u30c9\u30eb\u30af\u30e9\u30b9\u3092\u6271\u3046\u30b7\u30f3\u30d7\u30eb\u306a\u30e1\u30bd\u30c3\u30c9\u3092\u6301\u3063\u3066\u3044\u308b\u3060\u3051\u306e\u30af\u30e9\u30b9\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u5b9f\u88c5\u3067\u306f <code>ConnectorTableHandle<\/code>, <code>ConnectorColumnHandle<\/code>, <code>ConnectorSplit<\/code> \u4ee5\u5916\u306f\u6271\u308f\u306a\u3044\u306e\u3067\u3001\u3053\u308c\u3089\u306b\u95a2\u4fc2\u3057\u306a\u3044\u30e1\u30bd\u30c3\u30c9\u306f <code>UnsupportedOperationException<\/code> \u3092\u30b9\u30ed\u30fc\u3057\u305f\u308a\u3001<code>false<\/code> \u3092\u8fd4\u3059\u306e\u307f\u3068\u3057\u307e\u3057\u305f\u3002<\/p>\n<p><code>canHandle()<\/code> \u30e1\u30bd\u30c3\u30c9\u3084 <code>getSplitClass()<\/code> \u7b49\u3067\u4f7f\u308f\u308c\u3066\u3044\u308b <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorSplit.java\" target=\"_blank\"><code>ConnectorSplit<\/code><\/a> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3068\u305d\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3067\u3042\u308b <code>TechscoreSplit<\/code> \u306b\u3064\u3044\u3066\u306f\u6b21\u56de\u3001\u89e6\u308c\u308b\u4e88\u5b9a\u3067\u3059\u3002<\/p>\n<h2>\u30e1\u30bf\u30c7\u30fc\u30bf\u64cd\u4f5c\u30af\u30e9\u30b9<\/h2>\n<p>\u6b21\u306f\u91cd\u8981\u306a\u30e1\u30bf\u30c7\u30fc\u30bf\u30af\u30e9\u30b9\u3002Presto \u306f <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorMetadata.java\" target=\"_blank\"><code>ConnectorMetadata<\/code><\/a> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3092\u901a\u3057\u3066\u3001\u30b3\u30cd\u30af\u30bf\u30fc\u304c\u6271\u3046\u5404\u7a2e\u30e1\u30bf\u30c7\u30fc\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002<\/p>\n<h3>com.techscore.example.presto.plugin.TechscoreMetadata<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport static java.util.stream.Collectors.toList;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\nimport java.util.stream.Collectors;\r\n\r\nimport javax.inject.Inject;\r\n\r\nimport lombok.Getter;\r\nimport lombok.NonNull;\r\nimport lombok.val;\r\n\r\nimport org.weakref.jmx.internal.guava.collect.ImmutableList;\r\n\r\nimport com.facebook.presto.spi.ColumnMetadata;\r\nimport com.facebook.presto.spi.ConnectorColumnHandle;\r\nimport com.facebook.presto.spi.ConnectorSession;\r\nimport com.facebook.presto.spi.ConnectorTableHandle;\r\nimport com.facebook.presto.spi.ConnectorTableMetadata;\r\nimport com.facebook.presto.spi.ReadOnlyConnectorMetadata;\r\nimport com.facebook.presto.spi.SchemaTableName;\r\nimport com.facebook.presto.spi.SchemaTablePrefix;\r\nimport com.google.common.collect.ImmutableMap;\r\nimport com.google.inject.name.Named;\r\n\r\npublic class TechscoreMetadata extends ReadOnlyConnectorMetadata {\r\n\r\n    @Getter\r\n    private final String connectorId;\r\n\r\n    @Getter\r\n    private final TechscoreClient tClient;\r\n\r\n    @Getter\r\n    private final TechscoreHandleResolver tHandleResolver;\r\n\r\n    @Getter\r\n    private final TechscoreConnectorConfig tConnectorConfig;\r\n\r\n    @Inject\r\n    public TechscoreMetadata(@Named(\"connectorId\") @NonNull String connectorId,\r\n            @NonNull TechscoreClient tClient,\r\n            @NonNull TechscoreHandleResolver tHandleResolver,\r\n            @NonNull TechscoreConnectorConfig tConnectorConfig) {\r\n        this.connectorId = connectorId;\r\n        this.tClient = tClient;\r\n        this.tHandleResolver = tHandleResolver;\r\n        this.tConnectorConfig = tConnectorConfig;\r\n    }\r\n\r\n    @Override\r\n    public List<String> listSchemaNames(ConnectorSession session) {\r\n        return getTClient().listSchemaNames();\r\n    }\r\n\r\n    @Override\r\n    public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTableName schemaTableName) {\r\n        return getTClient().getTTableHandle(schemaTableName);\r\n    }\r\n\r\n    @Override\r\n    public ConnectorTableMetadata getTableMetadata(ConnectorTableHandle tableHandle) {\r\n        val tTableHandle = getTHandleResolver().convertTableHandle(tableHandle);\r\n        if (tTableHandle == null) {\r\n            return null;\r\n        }\r\n\r\n        val schemaTableName = tTableHandle.getSchemaTableName();\r\n        val tColumnHandles = getTClient().getTColumnHandles(schemaTableName);\r\n        val columnMetadatas = new ArrayList<ColumnMetadata>();\r\n        tColumnHandles.forEach(t -> columnMetadatas.add(t.toColumnMetadata()));\r\n\r\n        return new ConnectorTableMetadata(schemaTableName, columnMetadatas);\r\n    }\r\n\r\n    @Override\r\n    public Map<String, ConnectorColumnHandle> getColumnHandles(ConnectorTableHandle tableHandle) {\r\n        val tTableHandle = getTHandleResolver().convertTableHandle(tableHandle);\r\n        val tColumnHandles = getTClient().getTColumnHandles(tTableHandle.getSchemaTableName());\r\n        val columnHandleMap = new HashMap<String, ConnectorColumnHandle>();\r\n        tColumnHandles.forEach(t -> columnHandleMap.put(t.getName(), t));\r\n        return columnHandleMap;\r\n    }\r\n\r\n    @Override\r\n    public ColumnMetadata getColumnMetadata(ConnectorTableHandle tableHandle, ConnectorColumnHandle columnHandle) {\r\n        getTHandleResolver().convertTableHandle(tableHandle);\r\n        val tColumnHandle = getTHandleResolver().convertColumnHandle(columnHandle);\r\n        return tColumnHandle.toColumnMetadata();\r\n    }\r\n\r\n    @Override\r\n    public List<SchemaTableName> listTables(ConnectorSession session, String schemaNameOrNull) {\r\n        return getTClient().listSchemaTableNames().stream()\r\n                .filter(t -> schemaNameOrNull == null || schemaNameOrNull.equals(t.getSchemaName()))\r\n                .collect(toList());\r\n    }\r\n\r\n    @Override\r\n    public ConnectorColumnHandle getSampleWeightColumnHandle(ConnectorTableHandle tableHandle) {\r\n        return null;\r\n    }\r\n\r\n    @Override\r\n    public Map<SchemaTableName, List<ColumnMetadata>> listTableColumns(\r\n            ConnectorSession session, @NonNull SchemaTablePrefix prefix) {\r\n        val tableColumns = ImmutableMap.<SchemaTableName, List<ColumnMetadata>>builder();\r\n        for (val schemaTableName : getTClient().listSchemaTableNames()) {\r\n            if (prefix.matches(schemaTableName)) {\r\n                val columnMetadataList = getTClient().getTColumnHandles(schemaTableName)\r\n                        .stream().map(TechscoreColumnHandle::toColumnMetadata)\r\n                        .collect(toList());\r\n                tableColumns.put(schemaTableName, ImmutableList.copyOf(columnMetadataList));\r\n            }\r\n        }\r\n        return tableColumns.build();\r\n    }\r\n\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorMetadata.java\" target=\"_blank\"><code>ConnectorMetadata<\/code><\/a> \u306f\u3001<code>ConnectorTableHandle<\/code> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u304a\u3088\u3073 <code>TechscoreColumnHandle<\/code> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u64cd\u4f5c\u3059\u308b\u91cd\u8981\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u3059\u3002\u305d\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3067\u3042\u308b <code>TechscoreMetadata<\/code> \u306f\u3001<code>ConnectorMetadata<\/code> \u306e\u62bd\u8c61\u30af\u30e9\u30b9\u3067\u3042\u308b <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ReadOnlyConnectorMetadata.java\" target=\"_blank\"><code>ReadOnlyConnectorMetadata<\/code><\/a> \u306e\u30b5\u30d6\u30af\u30e9\u30b9\u3068\u3057\u3066\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6ce8\u5165\u3057\u3066\u3044\u308b <code>TechscoreClient<\/code> \u306f\u672c\u30b5\u30f3\u30d7\u30eb\u30b3\u30cd\u30af\u30bf\u30fc\u306e\u70ba\u306b\u7528\u610f\u3057\u305f POJO \u3067\u3001\u4eee\u60f3\u306e\u300cTECHSCORE \u30d6\u30ed\u30b0 API \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u300d\u3067\u3059\u3002\u30b5\u30f3\u30d7\u30eb\u30b3\u30cd\u30af\u30bf\u30fc\u306f\u3053\u306e\u30af\u30e9\u30b9\u3092\u901a\u3057\u3066\u30c6\u30fc\u30d6\u30eb\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u3084\u30ec\u30b3\u30fc\u30c9\u3092\u53d6\u5f97\u3057\u307e\u3059\uff08\u4eca\u56de\u306f\u30b5\u30f3\u30d7\u30eb\u306a\u306e\u3067\u9759\u7684\u306b\u60c5\u5831\u3092\u8fd4\u3057\u3066\u3044\u308b\u3060\u3051\u306e\u30af\u30e9\u30b9\u3068\u306a\u3063\u3066\u3044\u307e\u3059\uff09\u3002<code>TechscoreClient<\/code> \u3068\u305d\u306e\u95a2\u9023\u30af\u30e9\u30b9\u306b\u3064\u3044\u3066\u306f\u672c\u8a18\u4e8b\u306e\u6700\u5f8c\u306b\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u63b2\u8f09\u3057\u307e\u3059\u3002<\/p>\n<p><code>listSchemaNames()<\/code> \u30e1\u30bd\u30c3\u30c9\u306f\u30b3\u30cd\u30af\u30bf\u30fc\u304c\u6271\u3046\u30b9\u30ad\u30fc\u30de\u306e\u540d\u524d\u3092\u8fd4\u3059\u3082\u306e\u3067\u3001<code>show schemas from techscore;<\/code> \u7b49\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u305f\u5834\u5408\u306b\u5229\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><code>getTableHandle()<\/code> \u30e1\u30bd\u30c3\u30c9\u3084 <code>getColumnHandles()<\/code> \u30e1\u30bd\u30c3\u30c9\u306f\u6307\u5b9a\u3055\u308c\u305f\u30c6\u30fc\u30d6\u30eb\u306e\u30c6\u30fc\u30d6\u30eb\u30cf\u30f3\u30c9\u30eb\u3084\u30ab\u30e9\u30e0\u30cf\u30f3\u30c9\u30eb\u3092\u8fd4\u3059\u3082\u306e\u3067\u3059\u3002\u30b7\u30b0\u30cb\u30c1\u30e3\u7684\u306b\u306f\u623b\u308a\u5024\u306e\u578b\u304c <code>ConnectorTableHandle<\/code> \u3084 <code>ConnectorColumnHandle<\/code> \u3068\u306a\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u672c\u30b3\u30cd\u30af\u30bf\u30fc\u3067\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3067\u3042\u308b <code>TechscoreTableHandle<\/code>, <code>TechscoreColumnHandle<\/code> \u3092\u8fd4\u3059\u3088\u3046\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p><code>getTableMetadata()<\/code> \u30e1\u30bd\u30c3\u30c9\u3084 <code>getColumnMetadata()<\/code> \u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30cf\u30f3\u30c9\u30eb\u3092 <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ConnectorTableMetadata.java\" target=\"_blank\"><code>ConnectorTableMetadata<\/code><\/a> \u3084 <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/ColumnMetadata.java\" target=\"_blank\"><code>ColumnMetadata<\/code><\/a> \u3068\u3044\u3063\u305f\u30e1\u30bf\u30c7\u30fc\u30bf\u306b\u5909\u63db\u3059\u308b\u3082\u306e\u3067\u3059\u3002\u5f15\u6570\u306f\u578b\u3068\u3057\u3066 <code>ConnectorTableHandle<\/code> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3084 <code>ConnectorColumnHandle<\/code> \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u5b9f\u969b\u306b\u306f\u305d\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3067\u3042\u308b <code>TechscoreTableHandle<\/code>, <code>TechscoreColumnHandle<\/code> \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u6e21\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><code>listTables()<\/code> \u30e1\u30bd\u30c3\u30c9\u306f\u30b3\u30cd\u30af\u30bf\u30fc\u304c\u6271\u3046\u30c6\u30fc\u30d6\u30eb\u306e <code>SchemaTableName<\/code> \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30ea\u30b9\u30c8\u3092\u8fd4\u3059\u3082\u306e\u3067\u3001<code>show tables from techscore.schema1;<\/code> \u306e\u3088\u3046\u306a\u30b3\u30de\u30f3\u30c9\u767a\u884c\u6642\u306b\u5229\u7528\u3055\u308c\u307e\u3059\u3002\u3053\u3053\u3067\u8fd4\u3059 <code>SchemaTableName<\/code> \u306e\u30ea\u30b9\u30c8\u306f\u3001\u5f15\u6570 <code>String schemaNameOrNull<\/code> \u304c\u6307\u5b9a\u3059\u308b\u30b9\u30ad\u30fc\u30de\u306b\u5c5e\u3059\u30c6\u30fc\u30d6\u30eb\u306b\u3064\u3044\u3066\u3060\u3051\u3092\u6271\u3044\u307e\u3059\u304c\u3001<code>schemaNameOrNull<\/code> \u306e\u5024\u304c <code>null<\/code> \u306e\u5834\u5408\u306f\u30b9\u30ad\u30fc\u30de\u306b\u95a2\u4fc2\u306a\u304f\u5168\u3066\u306e\u30c6\u30fc\u30d6\u30eb\u306e <code>SchemaTableName<\/code> \u3092\u8fd4\u3059\u3088\u3046\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p><code>listTableColumns()<\/code> \u30e1\u30bd\u30c3\u30c9\u306f\u5f15\u6570\u306b\u5f93\u3063\u3066\u5bfe\u8c61\u30c6\u30fc\u30d6\u30eb\u306e\u30ab\u30e9\u30e0\u30ea\u30b9\u30c8\u3092\u8fd4\u3057\u307e\u3059\u3002\u5f15\u6570\u306e <a href=\"https:\/\/github.com\/facebook\/presto\/blob\/0.96\/presto-spi\/src\/main\/java\/com\/facebook\/presto\/spi\/SchemaTablePrefix.java\" target=\"_blank\"><code>SchemaTablePrefix<\/code><\/a> \u306f <code>SchemaTableName<\/code> \u3068\u540c\u69d8\u3001\u30b9\u30ad\u30fc\u30de\u540d\u3068\u30c6\u30fc\u30d6\u30eb\u540d\u3092\u6301\u3064\u30af\u30e9\u30b9\u3067\u3059\u304c\u3001<code>SchemaTableName<\/code> \u3068\u306f\u9055\u3044\u5404\u30d7\u30ed\u30d1\u30c6\u30a3\u304c <code>null<\/code> \u3092\u8a31\u53ef\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001\u305d\u306e\u5185\u5bb9\u306b\u3088\u3063\u3066\u6b21\u306e\u3088\u3046\u306b\u51e6\u7406\u3092\u5206\u3051\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li>\u300c\u30b9\u30ad\u30fc\u30de\u540d\u3082\u30c6\u30fc\u30d6\u30eb\u540d\u3082 <code>null<\/code> \u300d - \u5168\u30c6\u30fc\u30d6\u30eb\u3092\u5bfe\u8c61\u3068\u3057\u3001\u30c6\u30fc\u30d6\u30eb\u3054\u3068\u306e\u30ab\u30e9\u30e0\u30ea\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<li>\u300c\u30c6\u30fc\u30d6\u30eb\u540d\u306e\u307f <code>null<\/code> \u300d - \u6307\u5b9a\u3055\u308c\u305f\u30b9\u30ad\u30fc\u30de\u306b\u5c5e\u3059\u5168\u3066\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u5bfe\u8c61\u3068\u3057\u3001\u30c6\u30fc\u30d6\u30eb\u3054\u3068\u306e\u30ab\u30e9\u30e0\u30ea\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<li>\u300c\u3044\u305a\u308c\u3082 <code>null<\/code> \u3067\u306f\u306a\u3044\u300d - \u6307\u5b9a\u3055\u308c\u305f\u3072\u3068\u3064\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u5bfe\u8c61\u3068\u3057\u3001\u30ab\u30e9\u30e0\u30ea\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ul>\n<p>\u3053\u3053\u3067\u5f79\u306b\u7acb\u3064\u306e\u304c <code>SchemaTablePrefix#matches(SchemaTableName)<\/code> \u30e1\u30bd\u30c3\u30c9\u3067\u3001\u5f15\u6570\u3068\u3057\u3066\u6e21\u3057\u305f <code>SchemaTableName<\/code> \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c <code>SchemaTablePrefix<\/code> \u306b\u30de\u30c3\u30c1\u3059\u308b\u304b\u3092\u4e0a\u624b\u304f\u5224\u65ad\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n<h2>\u30c6\u30fc\u30d6\u30eb\u5b9a\u7fa9\u3068\u30c7\u30fc\u30bf<\/h2>\n<p>\u6700\u5f8c\u306b <code>TechscoreMetadata<\/code> \u3067\u5c11\u3057\u89e6\u308c\u305f <code>TechscoreClient<\/code> \u3068\u305d\u306e\u95a2\u9023\u30af\u30e9\u30b9\u306e\u30bd\u30fc\u30b9\u3092\u63b2\u8f09\u3057\u307e\u3059\u3002<\/p>\n<p>\u300c\u8a18\u4e8b\u30c6\u30fc\u30d6\u30eb \/ techscore.schema1.entries \u300d\u3068\u300c\u8457\u8005\u30c6\u30fc\u30d6\u30eb \/ techscore.schema1.authors \u300d\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>com.techscore.example.presto.plugin.TechscoreClient<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport static java.util.stream.Collectors.toList;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport javax.inject.Inject;\r\n\r\nimport lombok.Getter;\r\nimport lombok.NonNull;\r\nimport lombok.val;\r\n\r\nimport org.weakref.jmx.internal.guava.collect.Maps;\r\n\r\nimport com.facebook.presto.spi.SchemaTableName;\r\nimport com.google.inject.name.Named;\r\n\r\npublic class TechscoreClient {\r\n\r\n    @Getter\r\n    private final String connectorId;\r\n\r\n    @Getter\r\n    private final TechscoreConnectorConfig tConnectorConfig;\r\n\r\n    @Getter\r\n    private final Map<SchemaTableName, TechscoreTable> tTableMap;\r\n\r\n    @Inject\r\n    public TechscoreClient(@Named(\"connectorId\") @NonNull String connectorId,\r\n            @NonNull TechscoreConnectorConfig tConnectorConfig) {\r\n        this.connectorId = connectorId;\r\n        this.tConnectorConfig = tConnectorConfig;\r\n        this.tTableMap = Maps.uniqueIndex(TechscoreTables.list(connectorId, tConnectorConfig.getUrlBase()), t -> t.getSchemaTableName());\r\n    }\r\n\r\n    public List<String> listSchemaNames() {\r\n        return getTTableMap().values().stream().map(TechscoreTable::getSchemaName).collect(toList());\r\n    }\r\n\r\n    public List<SchemaTableName> listSchemaTableNames() {\r\n        return getTTableMap().values().stream().map(TechscoreTable::getSchemaTableName).collect(toList());\r\n    }\r\n\r\n    public TechscoreTableHandle getTTableHandle(@NonNull SchemaTableName schemaTableName) {\r\n        val table = getTTableMap().get(schemaTableName);\r\n        if (table == null) {\r\n            return null;\r\n        }\r\n        return table.getTTableHandle();\r\n    }\r\n\r\n    public List<TechscoreColumnHandle> getTColumnHandles(@NonNull SchemaTableName schemaTableName) {\r\n        val table = getTTableMap().get(schemaTableName);\r\n        if (table == null) {\r\n            return null;\r\n        }\r\n        return table.getTColumnHandles();\r\n    }\r\n\r\n    public TechscoreRecordCursor createTRecordCursor(@NonNull TechscoreSplit tSplit, @NonNull List<TechscoreColumnHandle> tColumnHandles) {\r\n        val schemaTableName = tSplit.getSchemaTableName();\r\n        val table = getTTableMap().get(schemaTableName);\r\n        if (table == null) {\r\n            return null;\r\n        }\r\n        return new TechscoreRecordCursor(tColumnHandles, table.getData());\r\n    }\r\n}\r\n<\/pre>\n<h3>com.techscore.example.presto.plugin.TechscoreTables<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport java.time.LocalDateTime;\r\nimport java.util.List;\r\n\r\nimport lombok.NonNull;\r\nimport lombok.val;\r\n\r\nimport com.facebook.presto.spi.SchemaTableName;\r\nimport com.facebook.presto.spi.type.BigintType;\r\nimport com.facebook.presto.spi.type.TimestampType;\r\nimport com.facebook.presto.spi.type.VarcharType;\r\nimport com.google.common.collect.ImmutableList;\r\n\r\npublic class TechscoreTables {\r\n\r\n    public static List<TechscoreTable> list(@NonNull String connectorId, String urlBase) {\r\n        \/\/ \u8a18\u4e8b\u30c6\u30fc\u30d6\u30eb\u5b9a\u7fa9\r\n        val entriesTableHandle = new TechscoreTableHandle(connectorId, new SchemaTableName(\"schema1\", \"entries\"));\r\n        val entriesColumnHandle = ImmutableList.<TechscoreColumnHandle>of(\r\n                new TechscoreColumnHandle(connectorId, \"id\", BigintType.BIGINT, 0),\r\n                new TechscoreColumnHandle(connectorId, \"title\", VarcharType.VARCHAR, 1),\r\n                new TechscoreColumnHandle(connectorId, \"path\", VarcharType.VARCHAR, 2),\r\n                new TechscoreColumnHandle(connectorId, \"posted_by\", BigintType.BIGINT, 3),\r\n                new TechscoreColumnHandle(connectorId, \"posted_at\", TimestampType.TIMESTAMP, 4));\r\n        val entriesData = ImmutableList.<List<Object>>of(\r\n                ImmutableList.<Object>of(Long.valueOf(1L), \"Riding Rails \u52c9\u5f37\u4f1a #1 Rails \u3092\u306e\u308a\u3053\u306a\u305b\uff01\u3084\u308a\u307e\u3057\u305f\uff01\u767a\u8868\u8cc7\u6599\u3082\uff01\", urlBase + \"2015\/04\/23\/riding-rails-vol1-yattayo\/\", Long.valueOf(1L), LocalDateTime.parse(\"2015-04-23T10:54:00\")),\r\n                ImmutableList.<Object>of(Long.valueOf(2L), \"Ruby on Rails 4.2 rc2 \u304c\u51fa\u305f\u306e\u3067 Release \u30ce\u30fc\u30c8\u3092\u8aad\u3080\", urlBase + \"2014\/12\/13\/rails-4-2-release-notes\/\", Long.valueOf(1L), LocalDateTime.parse(\"2014-12-13T10:00:00\")),\r\n                ImmutableList.<Object>of(Long.valueOf(3L), \"Gradle \u30c7\u30d5\u30a9\u30eb\u30c8\u30bf\u30b9\u30af\u306b\u540d\u524d\u3092\u3064\u3051\u308b\", urlBase + \"2014\/12\/23\/gradle-defaulttasks\/\", Long.valueOf(2L), LocalDateTime.parse(\"2014-12-23T10:00:00\")));\r\n        val entriesTable = new TechscoreTable(entriesTableHandle, entriesColumnHandle, entriesData);\r\n\r\n        \/\/ \u8457\u8005\u30c6\u30fc\u30d6\u30eb\u5b9a\u7fa9\r\n        val authorsTableHandle = new TechscoreTableHandle(connectorId, new SchemaTableName(\"schema1\", \"authors\"));\r\n        val authorsColumnHandle = ImmutableList.<TechscoreColumnHandle>of(\r\n                new TechscoreColumnHandle(connectorId, \"id\", BigintType.BIGINT, 0),\r\n                new TechscoreColumnHandle(connectorId, \"name\", VarcharType.VARCHAR, 1));\r\n        val authorsData = ImmutableList.<List<Object>>of(\r\n                ImmutableList.<Object>of(Long.valueOf(1L), \"suzuki-kei\"),\r\n                ImmutableList.<Object>of(Long.valueOf(2L), \"ter@\"));\r\n        val authorsTable = new TechscoreTable(authorsTableHandle, authorsColumnHandle, authorsData);\r\n\r\n        return ImmutableList.of(entriesTable, authorsTable);\r\n    }\r\n}\r\n<\/pre>\n<h3>com.techscore.example.presto.plugin.TechscoreTable<\/h3>\n<pre class=\"lang:java decode:true\">\r\npackage com.techscore.example.presto.plugin;\r\n\r\nimport java.util.List;\r\n\r\nimport lombok.NonNull;\r\nimport lombok.Value;\r\n\r\nimport org.weakref.jmx.internal.guava.collect.ImmutableList;\r\n\r\nimport com.facebook.presto.spi.SchemaTableName;\r\n\r\n@Value\r\npublic class TechscoreTable {\r\n\r\n    private final TechscoreTableHandle tTableHandle;\r\n    private final List<TechscoreColumnHandle> tColumnHandles;\r\n    private final List<List<Object>> data;\r\n\r\n    public TechscoreTable(@NonNull TechscoreTableHandle tTableHandle,\r\n            @NonNull List<TechscoreColumnHandle> tColumnHandle,\r\n            @NonNull List<List<Object>> data) {\r\n        this.tTableHandle = tTableHandle;\r\n        this.tColumnHandles = ImmutableList.copyOf(tColumnHandle);\r\n        this.data = ImmutableList.copyOf(data);\r\n    }\r\n\r\n    public SchemaTableName getSchemaTableName() {\r\n        return getTTableHandle().getSchemaTableName();\r\n    }\r\n\r\n    public String getSchemaName() {\r\n        return getTTableHandle().getSchemaName();\r\n    }\r\n\r\n    public String getTableName() {\r\n        return getTTableHandle().getTableName();\r\n    }\r\n}\r\n<\/pre>\n<p>\u3068\u3001\u3053\u3053\u3067\u6c17\u3065\u304d\u307e\u3057\u305f\u304c\u3001\u3053\u306e\u307e\u307e\u3067\u306f <code>TechscoreTables<\/code> \u5185\u306e\u6587\u5b57\u5217\u30ea\u30c6\u30e9\u30eb\u304c\u6587\u5b57\u5316\u3051\u3092\u8d77\u3053\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u306d\u3002build.gradle \u306b\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u8a2d\u5b9a\u3092\u8ffd\u52a0\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"lang:java decode:true\">\r\ntasks.withType(AbstractCompile) each { it.options.encoding = 'UTF-8' }\r\n<\/pre>\n<h2>\u6b21\u56de\u306f<\/h2>\n<p>\u7b2c\u4e09\u56de\u306e\u6b21\u56de\u306f\u3044\u3088\u3044\u3088\u30ec\u30b3\u30fc\u30c9\u64cd\u4f5c\u7cfb\u306e\u30af\u30e9\u30b9\u306e\u5b9f\u88c5\u306b\u9032\u307f\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3002\u677e\u672c\u3067\u3059\u3002<\/p>\n<p>\u524d\u56de\u306b\u7d9a\u304d\u3001Presto \u306e\u30b3\u30cd\u30af\u30bf\u30fc\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002\u7b2c\u4e8c\u56de\u306e\u4eca\u56de\u306f\u30c6\u30fc\u30d6\u30eb\u306e\u30cf\u30f3\u30c9\u30eb\u30af\u30e9\u30b9\u3084\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u64cd\u4f5c\u3059\u308b\u30af\u30e9\u30b9\u3092\u6271\u3044\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u88c5\u3059\u308b\u4e3b\u306a\u30af\u30e9\u30b9\u306f\u6b21\u306e 4 \u3064\u3067\u3059\u3002<br \/><a href=\"https:\/\/www.techscore.com\/blog\/2015\/06\/01\/presto-connector-development-2\/\">\u7d9a\u304d\u3092\u8aad\u3080...<\/a><\/p>\n","protected":false},"author":14,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18],"tags":[57,193],"_links":{"self":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/7378"}],"collection":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/comments?post=7378"}],"version-history":[{"count":55,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/7378\/revisions"}],"predecessor-version":[{"id":7497,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/7378\/revisions\/7497"}],"wp:attachment":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/media?parent=7378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/categories?post=7378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/tags?post=7378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}