You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ga...@apache.org on 2017/12/18 22:28:21 UTC

hive git commit: HIVE-17981 Create a set of builders for Thrift classes. This closes #274. (Alan Gates, reviewed by Peter Vary)

Repository: hive
Updated Branches:
  refs/heads/master ad106f0c4 -> 12a33fd0d


HIVE-17981 Create a set of builders for Thrift classes.  This closes #274.  (Alan Gates, reviewed by Peter Vary)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/12a33fd0
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/12a33fd0
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/12a33fd0

Branch: refs/heads/master
Commit: 12a33fd0d1f82422048af5a389671812bdf03c93
Parents: ad106f0
Author: Alan Gates <ga...@hortonworks.com>
Authored: Mon Dec 18 14:27:13 2017 -0800
Committer: Alan Gates <ga...@hortonworks.com>
Committed: Mon Dec 18 14:27:13 2017 -0800

----------------------------------------------------------------------
 .../client/builder/ConstraintBuilder.java       |  98 +++++++++
 .../client/builder/DatabaseBuilder.java         |  89 ++++++++
 .../GrantRevokePrivilegeRequestBuilder.java     |  63 ++++++
 .../builder/HiveObjectPrivilegeBuilder.java     |  63 ++++++
 .../client/builder/HiveObjectRefBuilder.java    |  63 ++++++
 .../metastore/client/builder/IndexBuilder.java  | 104 +++++++++
 .../client/builder/PartitionBuilder.java        | 102 +++++++++
 .../builder/PrivilegeGrantInfoBuilder.java      |  84 ++++++++
 .../metastore/client/builder/RoleBuilder.java   |  55 +++++
 .../client/builder/SQLForeignKeyBuilder.java    |  83 ++++++++
 .../builder/SQLNotNullConstraintBuilder.java    |  37 ++++
 .../client/builder/SQLPrimaryKeyBuilder.java    |  42 ++++
 .../builder/SQLUniqueConstraintBuilder.java     |  37 ++++
 .../builder/StorageDescriptorBuilder.java       | 210 +++++++++++++++++++
 .../metastore/client/builder/TableBuilder.java  | 156 ++++++++++++++
 15 files changed, 1286 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/ConstraintBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/ConstraintBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/ConstraintBuilder.java
new file mode 100644
index 0000000..50e779a
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/ConstraintBuilder.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Table;
+
+/**
+ * Base builder for all types of constraints.  Database name, table name, and column name
+ * must be provided.
+ * @param <T> Type of builder extending this.
+ */
+abstract class ConstraintBuilder<T> {
+  protected String dbName, tableName, columnName, constraintName;
+  protected int keySeq;
+  protected boolean enable, validate, rely;
+  private T child;
+
+  protected ConstraintBuilder() {
+    keySeq = 1;
+    enable = true;
+    validate = rely = false;
+  }
+
+  protected void setChild(T child) {
+    this.child = child;
+  }
+
+  protected void checkBuildable(String defaultConstraintName) throws MetaException {
+    if (dbName == null || tableName == null || columnName == null) {
+      throw new MetaException("You must provide database name, table name, and column name");
+    }
+    if (constraintName == null) {
+      constraintName = dbName + "_" + tableName + "_" + columnName + "_" + defaultConstraintName;
+    }
+  }
+
+  public T setDbName(String dbName) {
+    this.dbName = dbName;
+    return child;
+  }
+
+  public T setTableName(String tableName) {
+    this.tableName = tableName;
+    return child;
+  }
+
+  public T setDbAndTableName(Table table) {
+    this.dbName = table.getDbName();
+    this.tableName = table.getTableName();
+    return child;
+  }
+
+  public T setColumnName(String columnName) {
+    this.columnName = columnName;
+    return child;
+  }
+
+  public T setConstraintName(String constraintName) {
+    this.constraintName = constraintName;
+    return child;
+  }
+
+  public T setKeySeq(int keySeq) {
+    this.keySeq = keySeq;
+    return child;
+  }
+
+  public T setEnable(boolean enable) {
+    this.enable = enable;
+    return child;
+  }
+
+  public T setValidate(boolean validate) {
+    this.validate = validate;
+    return child;
+  }
+
+  public T setRely(boolean rely) {
+    this.rely = rely;
+    return child;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/DatabaseBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/DatabaseBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/DatabaseBuilder.java
new file mode 100644
index 0000000..7627d89
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/DatabaseBuilder.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.PrincipalType;
+import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
+import org.apache.hadoop.hive.metastore.utils.SecurityUtils;
+import org.apache.thrift.TException;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A builder for {@link Database}.  The name of the new database is required.  Everything else
+ * selects reasonable defaults.
+ */
+public class DatabaseBuilder {
+  private String name, description, location;
+  private Map<String, String> params = new HashMap<>();
+  private String ownerName;
+  private PrincipalType ownerType;
+
+  public DatabaseBuilder setName(String name) {
+    this.name = name;
+    return this;
+  }
+
+  public DatabaseBuilder setDescription(String description) {
+    this.description = description;
+    return this;
+  }
+
+  public DatabaseBuilder setLocation(String location) {
+    this.location = location;
+    return this;
+  }
+
+  public DatabaseBuilder setParams(Map<String, String> params) {
+    this.params = params;
+    return this;
+  }
+
+  public DatabaseBuilder addParam(String key, String value) {
+    params.put(key, value);
+    return this;
+  }
+
+  public DatabaseBuilder setOwnerName(String ownerName) {
+    this.ownerName = ownerName;
+    return this;
+  }
+
+  public DatabaseBuilder setOwnerType(PrincipalType ownerType) {
+    this.ownerType = ownerType;
+    return this;
+  }
+
+  public Database build() throws TException {
+    if (name == null) throw new MetaException("You must name the database");
+    Database db = new Database(name, description, location, params);
+    try {
+      if (ownerName != null) ownerName = SecurityUtils.getUser();
+      db.setOwnerName(ownerName);
+      if (ownerType == null) ownerType = PrincipalType.USER;
+      db.setOwnerType(ownerType);
+      return db;
+    } catch (IOException e) {
+      throw MetaStoreUtils.newMetaException(e);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/GrantRevokePrivilegeRequestBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/GrantRevokePrivilegeRequestBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/GrantRevokePrivilegeRequestBuilder.java
new file mode 100644
index 0000000..26cea19
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/GrantRevokePrivilegeRequestBuilder.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.GrantRevokePrivilegeRequest;
+import org.apache.hadoop.hive.metastore.api.GrantRevokeType;
+import org.apache.hadoop.hive.metastore.api.HiveObjectPrivilege;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.PrivilegeBag;
+
+/**
+ * A builder for {@link GrantRevokePrivilegeRequest}.  The revoke of grant option defaults to
+ * false.  The request Type and the privileges must be provided.
+ */
+public class GrantRevokePrivilegeRequestBuilder {
+  private GrantRevokeType requestType;
+  private PrivilegeBag privileges;
+  private boolean revokeGrantOption;
+
+  public GrantRevokePrivilegeRequestBuilder() {
+    privileges = new PrivilegeBag();
+    revokeGrantOption = false;
+  }
+
+  public GrantRevokePrivilegeRequestBuilder setRequestType(GrantRevokeType requestType) {
+    this.requestType = requestType;
+    return this;
+  }
+
+  public GrantRevokePrivilegeRequestBuilder setRevokeGrantOption(boolean revokeGrantOption) {
+    this.revokeGrantOption = revokeGrantOption;
+    return this;
+  }
+
+  public GrantRevokePrivilegeRequestBuilder addPrivilege(HiveObjectPrivilege privilege) {
+    privileges.addToPrivileges(privilege);
+    return this;
+  }
+
+  public GrantRevokePrivilegeRequest build() throws MetaException {
+    if (requestType == null || privileges.getPrivilegesSize() == 0) {
+      throw new MetaException("The request type and at least one privilege must be provided.");
+    }
+    GrantRevokePrivilegeRequest rqst = new GrantRevokePrivilegeRequest(requestType, privileges);
+    if (revokeGrantOption) rqst.setRevokeGrantOption(revokeGrantOption);
+    return rqst;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectPrivilegeBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectPrivilegeBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectPrivilegeBuilder.java
new file mode 100644
index 0000000..d802e1a
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectPrivilegeBuilder.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.HiveObjectPrivilege;
+import org.apache.hadoop.hive.metastore.api.HiveObjectRef;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.PrincipalType;
+import org.apache.hadoop.hive.metastore.api.PrivilegeGrantInfo;
+
+/**
+ * Builder for {@link HiveObjectPrivilege}.  All values must be set.
+ */
+public class HiveObjectPrivilegeBuilder {
+  private HiveObjectRef hiveObjectRef;
+  private String principleName;
+  private PrincipalType principalType;
+  private PrivilegeGrantInfo grantInfo;
+
+  public HiveObjectPrivilegeBuilder setHiveObjectRef(HiveObjectRef hiveObjectRef) {
+    this.hiveObjectRef = hiveObjectRef;
+    return this;
+  }
+
+  public HiveObjectPrivilegeBuilder setPrincipleName(String principleName) {
+    this.principleName = principleName;
+    return this;
+  }
+
+  public HiveObjectPrivilegeBuilder setPrincipalType(PrincipalType principalType) {
+    this.principalType = principalType;
+    return this;
+  }
+
+  public HiveObjectPrivilegeBuilder setGrantInfo(PrivilegeGrantInfo grantInfo) {
+    this.grantInfo = grantInfo;
+    return this;
+  }
+
+  public HiveObjectPrivilege build() throws MetaException {
+    if (hiveObjectRef == null || principleName == null || principalType == null ||
+        grantInfo == null) {
+      throw new MetaException("hive object reference, principle name and type, and grant info " +
+          "must all be provided");
+    }
+    return new HiveObjectPrivilege(hiveObjectRef, principleName, principalType, grantInfo);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectRefBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectRefBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectRefBuilder.java
new file mode 100644
index 0000000..62a227a
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/HiveObjectRefBuilder.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.HiveObjectRef;
+import org.apache.hadoop.hive.metastore.api.HiveObjectType;
+import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.Table;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A builder for {@link HiveObjectRef}.  Unlike most builders (which allow a gradual building up
+ * of the values) this gives a number of methods that take the object to be referenced and then
+ * build the appropriate reference.  This is intended primarily for use with
+ * {@link HiveObjectPrivilegeBuilder}
+ */
+public class HiveObjectRefBuilder {
+  private HiveObjectType objectType;
+  private String dbName, objectName, columnName;
+  private List<String> partValues;
+
+  public HiveObjectRef buildGlobalReference() {
+    return new HiveObjectRef(HiveObjectType.GLOBAL, null, null, Collections.emptyList(), null);
+  }
+
+  public HiveObjectRef buildDatabaseReference(Database db) {
+    return new
+        HiveObjectRef(HiveObjectType.DATABASE, db.getName(), null, Collections.emptyList(), null);
+  }
+
+  public HiveObjectRef buildTableReference(Table table) {
+    return new HiveObjectRef(HiveObjectType.TABLE, table.getDbName(), table.getTableName(),
+        Collections.emptyList(), null);
+  }
+
+  public HiveObjectRef buildPartitionReference(Partition part) {
+    return new HiveObjectRef(HiveObjectType.PARTITION, part.getDbName(), part.getTableName(),
+        part.getValues(), null);
+  }
+
+  public HiveObjectRef buildColumnReference(Table table, String columnName) {
+    return new HiveObjectRef(HiveObjectType.TABLE, table.getDbName(), table.getTableName(),
+        Collections.emptyList(), columnName);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/IndexBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/IndexBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/IndexBuilder.java
new file mode 100644
index 0000000..6c8b1d8
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/IndexBuilder.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.Index;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Table;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Builder for indices.  You must supply the database name and table name (or table reference), a
+ * name for the index, and whatever StorageDescriptorBuilder requires.  All other fields will be
+ * given reasonable defaults.
+ */
+public class IndexBuilder extends StorageDescriptorBuilder<IndexBuilder> {
+  private String dbName, tableName, indexName, indexTableName, handlerClass;
+  private int createTime, lastAccessTime;
+  private Map<String, String> indexParams;
+  private boolean deferredRebuild;
+
+  public IndexBuilder() {
+    // Set some reasonable defaults
+    indexParams = new HashMap<>();
+    createTime = lastAccessTime = (int)(System.currentTimeMillis() / 1000);
+    super.setChild(this);
+  }
+
+  public IndexBuilder setDbName(String dbName) {
+    this.dbName = dbName;
+    return this;
+  }
+
+  public IndexBuilder setTableName(String tableName) {
+    this.tableName = tableName;
+    return this;
+  }
+
+  public IndexBuilder setDbAndTableName(Table table) {
+    this.dbName = table.getDbName();
+    this.tableName = table.getTableName();
+    return this;
+  }
+
+  public IndexBuilder setCreateTime(int createTime) {
+    this.createTime = createTime;
+    return this;
+  }
+
+  public IndexBuilder setLastAccessTime(int lastAccessTime) {
+    this.lastAccessTime = lastAccessTime;
+    return this;
+  }
+
+  public IndexBuilder setIndexParams(Map<String, String> indexParams) {
+    this.indexParams = indexParams;
+    return this;
+  }
+
+  public IndexBuilder setIndexName(String indexName) {
+    this.indexName = indexName;
+    return this;
+  }
+
+  public IndexBuilder setIndexTableName(String indexTableName) {
+    this.indexTableName = indexTableName;
+    return this;
+  }
+
+  public IndexBuilder setHandlerClass(String handlerClass) {
+    this.handlerClass = handlerClass;
+    return this;
+  }
+
+  public IndexBuilder setDeferredRebuild(boolean deferredRebuild) {
+    this.deferredRebuild = deferredRebuild;
+    return this;
+  }
+
+  public Index build() throws MetaException {
+    if (dbName == null || tableName == null || indexName == null) {
+      throw new MetaException("You must provide database name, table name, and index name");
+    }
+    if (indexTableName == null) indexTableName = tableName + "_" + indexName + "_table";
+    return new Index(indexName, handlerClass, dbName, tableName, createTime, lastAccessTime,
+        indexTableName, buildSd(), indexParams, deferredRebuild);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PartitionBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PartitionBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PartitionBuilder.java
new file mode 100644
index 0000000..265625f
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PartitionBuilder.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.Table;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Builder for {@link Partition}.  The only requirements are 1. (database name and table name) or table
+ * reference; 2. partition values; 3. whatever {@link StorageDescriptorBuilder} requires.
+ */
+public class PartitionBuilder extends StorageDescriptorBuilder<PartitionBuilder> {
+  private String dbName, tableName;
+  private int createTime, lastAccessTime;
+  private Map<String, String> partParams;
+  private List<String> values;
+
+  public PartitionBuilder() {
+    // Set some reasonable defaults
+    partParams = new HashMap<>();
+    createTime = lastAccessTime = (int)(System.currentTimeMillis() / 1000);
+    super.setChild(this);
+  }
+
+  public PartitionBuilder setDbName(String dbName) {
+    this.dbName = dbName;
+    return this;
+  }
+
+  public PartitionBuilder setTableName(String tableName) {
+    this.tableName = tableName;
+    return this;
+  }
+
+  public PartitionBuilder setDbAndTableName(Table table) {
+    this.dbName = table.getDbName();
+    this.tableName = table.getTableName();
+    return this;
+  }
+
+  public PartitionBuilder setValues(List<String> values) {
+    this.values = values;
+    return this;
+  }
+
+  public PartitionBuilder addValue(String value) {
+    if (values == null) values = new ArrayList<>();
+    values.add(value);
+    return this;
+  }
+
+  public PartitionBuilder setCreateTime(int createTime) {
+    this.createTime = createTime;
+    return this;
+  }
+
+  public PartitionBuilder setLastAccessTime(int lastAccessTime) {
+    this.lastAccessTime = lastAccessTime;
+    return this;
+  }
+
+  public PartitionBuilder setPartParams(Map<String, String> partParams) {
+    this.partParams = partParams;
+    return this;
+  }
+
+  public PartitionBuilder addPartParam(String key, String value) {
+    if (partParams == null) partParams = new HashMap<>();
+    partParams.put(key, value);
+    return this;
+  }
+
+  public Partition build() throws MetaException {
+    if (dbName == null || tableName == null) {
+      throw new MetaException("database name and table name must be provided");
+    }
+    if (values == null) throw new MetaException("You must provide partition values");
+    return new Partition(values, dbName, tableName, createTime, lastAccessTime, buildSd(),
+        partParams);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PrivilegeGrantInfoBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PrivilegeGrantInfoBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PrivilegeGrantInfoBuilder.java
new file mode 100644
index 0000000..2e7fe5a
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/PrivilegeGrantInfoBuilder.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.PrincipalType;
+import org.apache.hadoop.hive.metastore.api.PrivilegeGrantInfo;
+import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
+import org.apache.hadoop.hive.metastore.utils.SecurityUtils;
+
+import java.io.IOException;
+
+/**
+ * Builder for {@link PrivilegeGrantInfo}.  The privilege is required.  If not provided the grantor
+ * is
+ * assumed to be the current user.  This is really intended for use by the
+ * {@link HiveObjectPrivilegeBuilder}.
+ */
+public class PrivilegeGrantInfoBuilder {
+  private String privilege, grantor;
+  private int createTime;
+  private PrincipalType grantorType;
+  private boolean grantOption;
+
+  public PrivilegeGrantInfoBuilder() {
+    createTime = (int)(System.currentTimeMillis() / 1000);
+    grantOption = false;
+  }
+
+  public PrivilegeGrantInfoBuilder setPrivilege(String privilege) {
+    this.privilege = privilege;
+    return this;
+  }
+
+  public PrivilegeGrantInfoBuilder setGrantor(String grantor) {
+    this.grantor = grantor;
+    return this;
+  }
+
+  public PrivilegeGrantInfoBuilder setCreateTime(int createTime) {
+    this.createTime = createTime;
+    return this;
+  }
+
+  public PrivilegeGrantInfoBuilder setGrantorType(PrincipalType grantorType) {
+    this.grantorType = grantorType;
+    return this;
+  }
+
+  public PrivilegeGrantInfoBuilder setGrantOption(boolean grantOption) {
+    this.grantOption = grantOption;
+    return this;
+  }
+
+  public PrivilegeGrantInfo build() throws MetaException {
+    if (privilege == null) {
+      throw new MetaException("Privilege must be provided.");
+    }
+    if (grantor == null) {
+      try {
+        grantor = SecurityUtils.getUser();
+        grantorType = PrincipalType.USER;
+      } catch (IOException e) {
+        throw MetaStoreUtils.newMetaException(e);
+      }
+    }
+    return new PrivilegeGrantInfo(privilege, createTime, grantor, grantorType, grantOption);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/RoleBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/RoleBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/RoleBuilder.java
new file mode 100644
index 0000000..0b8d189
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/RoleBuilder.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Role;
+
+/**
+ * A builder for {@link Role}.  The roleName and the ownerName must be provided.
+ */
+public class RoleBuilder {
+  private String roleName, ownerName;
+  private int createTime;
+
+  public RoleBuilder() {
+    createTime = (int)(System.currentTimeMillis() / 1000);
+  }
+
+  public RoleBuilder setRoleName(String roleName) {
+    this.roleName = roleName;
+    return this;
+  }
+
+  public RoleBuilder setOwnerName(String ownerName) {
+    this.ownerName = ownerName;
+    return this;
+  }
+
+  public RoleBuilder setCreateTime(int createTime) {
+    this.createTime = createTime;
+    return this;
+  }
+
+  public Role build() throws MetaException {
+    if (roleName == null || ownerName == null) {
+      throw new MetaException("role name and owner name must be provided.");
+    }
+    return new Role(roleName, createTime, ownerName);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLForeignKeyBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLForeignKeyBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLForeignKeyBuilder.java
new file mode 100644
index 0000000..a39319a
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLForeignKeyBuilder.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.SQLForeignKey;
+import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
+
+/**
+ * Builder for {@link SQLForeignKey}.  Requires what {@link ConstraintBuilder} requires, plus
+ * primary key
+ * database, table, column and name.
+ */
+public class SQLForeignKeyBuilder extends ConstraintBuilder<SQLForeignKeyBuilder> {
+  private String pkDb, pkTable, pkColumn, pkName;
+  private int updateRule, deleteRule;
+
+  public SQLForeignKeyBuilder() {
+    updateRule = deleteRule = 0;
+  }
+
+  public SQLForeignKeyBuilder setPkDb(String pkDb) {
+    this.pkDb = pkDb;
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setPkTable(String pkTable) {
+    this.pkTable = pkTable;
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setPkColumn(String pkColumn) {
+    this.pkColumn = pkColumn;
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setPkName(String pkName) {
+    this.pkName = pkName;
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setPrimaryKey(SQLPrimaryKey pk) {
+    pkDb = pk.getTable_db();
+    pkTable = pk.getTable_name();
+    pkColumn = pk.getColumn_name();
+    pkName = pk.getPk_name();
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setUpdateRule(int updateRule) {
+    this.updateRule = updateRule;
+    return this;
+  }
+
+  public SQLForeignKeyBuilder setDeleteRule(int deleteRule) {
+    this.deleteRule = deleteRule;
+    return this;
+  }
+
+  public SQLForeignKey build() throws MetaException {
+    checkBuildable("foreign_key");
+    if (pkDb == null || pkTable == null || pkColumn == null || pkName == null) {
+      throw new MetaException("You must provide the primary key database, table, column, and name");
+    }
+    return new SQLForeignKey(pkDb, pkTable, pkColumn, dbName, tableName, columnName, keySeq,
+        updateRule, deleteRule, constraintName, pkName, enable, validate, rely);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLNotNullConstraintBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLNotNullConstraintBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLNotNullConstraintBuilder.java
new file mode 100644
index 0000000..77d1e49
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLNotNullConstraintBuilder.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.SQLNotNullConstraint;
+
+/**
+ * Builder for {@link SQLNotNullConstraint}.  Only requires what {@link ConstraintBuilder} requires.
+ */
+public class SQLNotNullConstraintBuilder extends ConstraintBuilder<SQLNotNullConstraintBuilder> {
+
+  public SQLNotNullConstraintBuilder() {
+    super.setChild(this);
+  }
+
+  public SQLNotNullConstraint build() throws MetaException {
+    checkBuildable("not_null_constraint");
+    return new SQLNotNullConstraint(dbName, tableName, columnName, constraintName, enable,
+        validate, rely);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLPrimaryKeyBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLPrimaryKeyBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLPrimaryKeyBuilder.java
new file mode 100644
index 0000000..9000f86
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLPrimaryKeyBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
+
+/**
+ * Builder for {@link SQLPrimaryKey}.  Only requires what {@link ConstraintBuilder} requires.
+ */
+public class SQLPrimaryKeyBuilder extends ConstraintBuilder<SQLPrimaryKeyBuilder> {
+
+  public SQLPrimaryKeyBuilder() {
+    super.setChild(this);
+  }
+
+  // Just to translate
+  public SQLPrimaryKeyBuilder setPrimaryKeyName(String name) {
+    return setConstraintName(name);
+  }
+
+  public SQLPrimaryKey build() throws MetaException {
+    checkBuildable("primary_key");
+    return new SQLPrimaryKey(dbName, tableName, columnName, keySeq, constraintName, enable,
+        validate, rely);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLUniqueConstraintBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLUniqueConstraintBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLUniqueConstraintBuilder.java
new file mode 100644
index 0000000..640e9d1
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/SQLUniqueConstraintBuilder.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.SQLUniqueConstraint;
+
+/**
+ * Builder for {@link SQLUniqueConstraint}.  Only requires what {@link ConstraintBuilder} requires.
+ */
+public class SQLUniqueConstraintBuilder extends ConstraintBuilder<SQLUniqueConstraintBuilder> {
+
+  public SQLUniqueConstraintBuilder() {
+    super.setChild(this);
+  }
+
+  public SQLUniqueConstraint build() throws MetaException {
+    checkBuildable("unique_constraint");
+    return new SQLUniqueConstraint(dbName, tableName, columnName, keySeq, constraintName, enable,
+        validate, rely);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/StorageDescriptorBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/StorageDescriptorBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/StorageDescriptorBuilder.java
new file mode 100644
index 0000000..39d1fa2
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/StorageDescriptorBuilder.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Order;
+import org.apache.hadoop.hive.metastore.api.SerDeInfo;
+import org.apache.hadoop.hive.metastore.api.SkewedInfo;
+import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Builds a {@link StorageDescriptor}.  Only requires that columns be set.  It picks reasonable
+ * defaults for everything else.  This is intended for use just by objects that have a StorageDescriptor,
+ * not direct use.
+ */
+abstract class StorageDescriptorBuilder<T> {
+  private static final String SERDE_LIB = "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe";
+  private static final String INPUT_FORMAT = "org.apache.hadoop.hive.ql.io.HiveInputFormat";
+  private static final String OUTPUT_FORMAT = "org.apache.hadoop.hive.ql.io.HiveOutputFormat";
+
+  private String location, inputFormat, outputFormat, serdeName, serdeLib;
+  private List<FieldSchema> cols;
+  private int numBuckets;
+  private Map<String, String> storageDescriptorParams, serdeParams;
+  private boolean compressed, storedAsSubDirectories;
+  private List<String> bucketCols, skewedColNames;
+  private List<Order> sortCols;
+  private List<List<String>> skewedColValues;
+  private Map<List<String>, String> skewedColValueLocationMaps;
+  // This enables us to return the correct type from the builder
+  private T child;
+
+  protected StorageDescriptorBuilder() {
+    // Set some reasonable defaults
+    storageDescriptorParams = new HashMap<>();
+    serdeParams = new HashMap<>();
+    bucketCols = new ArrayList<>();
+    sortCols = new ArrayList<>();
+    numBuckets = 0;
+    compressed = false;
+    inputFormat = INPUT_FORMAT;
+    outputFormat = OUTPUT_FORMAT;
+    serdeLib = SERDE_LIB;
+    skewedColNames = new ArrayList<>();
+    skewedColValues = new ArrayList<>();
+    skewedColValueLocationMaps = new HashMap<>();
+  }
+
+  protected StorageDescriptor buildSd() throws MetaException {
+    if (cols == null) throw new MetaException("You must provide the columns");
+    SerDeInfo serdeInfo = new SerDeInfo(serdeName, serdeLib, serdeParams);
+    StorageDescriptor sd = new StorageDescriptor(cols, location, inputFormat, outputFormat,
+        compressed, numBuckets, serdeInfo, bucketCols, sortCols, storageDescriptorParams);
+    sd.setStoredAsSubDirectories(storedAsSubDirectories);
+    if (skewedColNames != null) {
+      SkewedInfo skewed = new SkewedInfo(skewedColNames, skewedColValues,
+          skewedColValueLocationMaps);
+      sd.setSkewedInfo(skewed);
+    }
+    return sd;
+  }
+
+  protected void setChild(T child) {
+    this.child = child;
+  }
+
+  public T setLocation(String location) {
+    this.location = location;
+    return child;
+  }
+
+  public T setInputFormat(String inputFormat) {
+    this.inputFormat = inputFormat;
+    return child;
+  }
+
+  public T setOutputFormat(String outputFormat) {
+    this.outputFormat = outputFormat;
+    return child;
+  }
+
+  public T setSerdeName(String serdeName) {
+    this.serdeName = serdeName;
+    return child;
+  }
+
+  public T setSerdeLib(String serdeLib) {
+    this.serdeLib = serdeLib;
+    return child;
+  }
+  public T setCols(List<FieldSchema> cols) {
+    this.cols = cols;
+    return child;
+  }
+
+  public T addCol(String name, String type, String comment) {
+    if (cols == null) cols = new ArrayList<>();
+    cols.add(new FieldSchema(name, type, comment));
+    return child;
+  }
+
+  public T addCol(String name, String type) {
+    return addCol(name, type, "");
+  }
+
+  public T setNumBuckets(int numBuckets) {
+    this.numBuckets = numBuckets;
+    return child;
+  }
+
+  public T setStorageDescriptorParams(
+      Map<String, String> storageDescriptorParams) {
+    this.storageDescriptorParams = storageDescriptorParams;
+    return child;
+  }
+
+  public T addStorageDescriptorParam(String key, String value) {
+    if (storageDescriptorParams == null) storageDescriptorParams = new HashMap<>();
+    storageDescriptorParams.put(key, value);
+    return child;
+  }
+
+  public T setSerdeParams(Map<String, String> serdeParams) {
+    this.serdeParams = serdeParams;
+    return child;
+  }
+
+  public T addSerdeParam(String key, String value) {
+    if (serdeParams == null) serdeParams = new HashMap<>();
+    serdeParams.put(key, value);
+    return child;
+  }
+
+  public T setCompressed(boolean compressed) {
+    this.compressed = compressed;
+    return child;
+  }
+
+  public T setStoredAsSubDirectories(boolean storedAsSubDirectories) {
+    this.storedAsSubDirectories = storedAsSubDirectories;
+    return child;
+  }
+
+  public T setBucketCols(List<String> bucketCols) {
+    this.bucketCols = bucketCols;
+    return child;
+  }
+
+  public T addBucketCol(String bucketCol) {
+    if (bucketCols == null) bucketCols = new ArrayList<>();
+    bucketCols.add(bucketCol);
+    return child;
+  }
+
+  public T setSkewedColNames(List<String> skewedColNames) {
+    this.skewedColNames = skewedColNames;
+    return child;
+  }
+
+  public T addSkewedColName(String skewedColName) {
+    if (skewedColNames == null) skewedColNames = new ArrayList<>();
+    skewedColNames.add(skewedColName);
+    return child;
+  }
+
+  public T setSortCols(List<Order> sortCols) {
+    this.sortCols = sortCols;
+    return child;
+  }
+
+  public T addSortCol(String col, int order) {
+    if (sortCols == null) sortCols = new ArrayList<>();
+    sortCols.add(new Order(col, order));
+    return child;
+  }
+
+  // It is not at all clear how to flatten these last two out in a useful way, and no one uses
+  // these anyway.
+  public T setSkewedColValues(List<List<String>> skewedColValues) {
+    this.skewedColValues = skewedColValues;
+    return child;
+  }
+
+  public T setSkewedColValueLocationMaps(
+      Map<List<String>, String> skewedColValueLocationMaps) {
+    this.skewedColValueLocationMaps = skewedColValueLocationMaps;
+    return child;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/12a33fd0/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java
----------------------------------------------------------------------
diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java
new file mode 100644
index 0000000..1d457a6
--- /dev/null
+++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.metastore.client.builder;
+
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Table;
+import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
+import org.apache.hadoop.hive.metastore.utils.SecurityUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Build a {@link Table}.  The database name and table name must be provided, plus whatever is
+ * needed by the underlying {@link StorageDescriptorBuilder}.
+ */
+public class TableBuilder extends StorageDescriptorBuilder<TableBuilder> {
+  private String dbName, tableName, owner, viewOriginalText, viewExpandedText, type;
+  private List<FieldSchema> partCols;
+  private int createTime, lastAccessTime, retention;
+  private Map<String, String> tableParams;
+  private boolean rewriteEnabled, temporary;
+
+  public TableBuilder() {
+    // Set some reasonable defaults
+    tableParams = new HashMap<>();
+    createTime = lastAccessTime = (int)(System.currentTimeMillis() / 1000);
+    retention = 0;
+    super.setChild(this);
+  }
+
+  public TableBuilder setDbName(String dbName) {
+    this.dbName = dbName;
+    return this;
+  }
+
+  public TableBuilder setDbName(Database db) {
+    this.dbName = db.getName();
+    return this;
+  }
+
+  public TableBuilder setTableName(String tableName) {
+    this.tableName = tableName;
+    return this;
+  }
+
+  public TableBuilder setOwner(String owner) {
+    this.owner = owner;
+    return this;
+  }
+
+  public TableBuilder setViewOriginalText(String viewOriginalText) {
+    this.viewOriginalText = viewOriginalText;
+    return this;
+  }
+
+  public TableBuilder setViewExpandedText(String viewExpandedText) {
+    this.viewExpandedText = viewExpandedText;
+    return this;
+  }
+
+  public TableBuilder setType(String type) {
+    this.type = type;
+    return this;
+  }
+
+  public TableBuilder setPartCols(List<FieldSchema> partCols) {
+    this.partCols = partCols;
+    return this;
+  }
+
+  public TableBuilder addPartCol(String name, String type, String comment) {
+    if (partCols == null) partCols = new ArrayList<>();
+    partCols.add(new FieldSchema(name, type, comment));
+    return this;
+  }
+
+  public TableBuilder addPartCol(String name, String type) {
+    return addPartCol(name, type, "");
+  }
+
+  public TableBuilder setCreateTime(int createTime) {
+    this.createTime = createTime;
+    return this;
+  }
+
+  public TableBuilder setLastAccessTime(int lastAccessTime) {
+    this.lastAccessTime = lastAccessTime;
+    return this;
+  }
+
+  public TableBuilder setRetention(int retention) {
+    this.retention = retention;
+    return this;
+  }
+
+  public TableBuilder setTableParams(Map<String, String> tableParams) {
+    this.tableParams = tableParams;
+    return this;
+  }
+
+  public TableBuilder addTableParam(String key, String value) {
+    if (tableParams == null) tableParams = new HashMap<>();
+    tableParams.put(key, value);
+    return this;
+  }
+
+  public TableBuilder setRewriteEnabled(boolean rewriteEnabled) {
+    this.rewriteEnabled = rewriteEnabled;
+    return this;
+  }
+
+  public TableBuilder setTemporary(boolean temporary) {
+    this.temporary = temporary;
+    return this;
+  }
+
+  public Table build() throws MetaException {
+    if (dbName == null || tableName == null) {
+      throw new MetaException("You must set the database and table name");
+    }
+    if (owner == null) {
+      try {
+        owner = SecurityUtils.getUser();
+      } catch (IOException e) {
+        throw MetaStoreUtils.newMetaException(e);
+      }
+    }
+    Table t = new Table(tableName, dbName, owner, createTime, lastAccessTime, retention, buildSd(),
+        partCols, tableParams, viewOriginalText, viewExpandedText, type);
+    if (rewriteEnabled) t.setRewriteEnabled(true);
+    if (temporary) t.setTemporary(temporary);
+    return t;
+  }
+
+}