This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch watermark-demo
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/watermark-demo by this push:
new fe8911d add data authorize in qp
new 1ea7d3b Merge branch 'watermark-demo' of
github.com:apache/incubator-iotdb into watermark-demo
fe8911d is described below
commit fe8911d10bff42d91364307a6ea9f6eb369e4ea9
Author: qiaojialin <[email protected]>
AuthorDate: Thu May 30 22:20:40 2019 +0800
add data authorize in qp
---
.../org/apache/iotdb/db/qp/QueryProcessor.java | 2 +
.../apache/iotdb/db/qp/constant/SQLConstant.java | 3 ++
.../iotdb/db/qp/executor/OverflowQPExecutor.java | 23 ++++++++++++
.../org/apache/iotdb/db/qp/logical/Operator.java | 2 +-
.../iotdb/db/qp/logical/sys/DataAuthOperator.java | 43 ++++++++++++++++++++++
.../iotdb/db/qp/physical/sys/DataAuthPlan.java | 43 ++++++++++++++++++++++
.../iotdb/db/qp/strategy/LogicalGenerator.java | 31 ++++++++++++++++
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 6 +++
.../apache/iotdb/db/qp/plan/PhysicalPlanTest.java | 21 +++++++++++
9 files changed, 173 insertions(+), 1 deletion(-)
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index 74a1abf..c0653b0 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -136,6 +136,8 @@ public class QueryProcessor {
case INSERT:
case INDEX:
case INDEXQUERY:
+ case GRANT_DATA_AUTH:
+ case REVOKE_DATA_AUTH:
return operator;
case QUERY:
case UPDATE:
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index 19640ed..eadfeda 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -67,6 +67,9 @@ public class SQLConstant {
public static final int TOK_DROP_INDEX = 32;
public static final int TOK_QUERY_INDEX = 33;
+ public static final int TOK_GRANT_DATA_AUTH = 34;
+ public static final int TOK_REVOKE_DATA_AUTH = 35;
+
public static final int TOK_AUTHOR_CREATE = 41;
public static final int TOK_AUTHOR_DROP = 42;
public static final int TOK_AUTHOR_GRANT = 43;
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
index 9ca337e..f22b2d9 100644
---
a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
+++
b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.db.metadata.MManager;
import org.apache.iotdb.db.metadata.MNode;
import org.apache.iotdb.db.monitor.MonitorConstants;
import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
import org.apache.iotdb.db.qp.logical.sys.AuthorOperator;
import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
@@ -48,6 +49,7 @@ import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
@@ -140,6 +142,10 @@ public class OverflowQPExecutor extends
QueryProcessExecutor {
case LIST_USER_ROLES:
AuthorPlan author = (AuthorPlan) plan;
return operateAuthor(author);
+ case GRANT_DATA_AUTH:
+ case REVOKE_DATA_AUTH:
+ DataAuthPlan dataAuthPlan = (DataAuthPlan) plan;
+ return operateDataAuth(dataAuthPlan);
case LOADDATA:
LoadDataPlan loadData = (LoadDataPlan) plan;
LoadDataUtils load = new LoadDataUtils();
@@ -304,6 +310,23 @@ public class OverflowQPExecutor extends
QueryProcessExecutor {
return MManager.getInstance().getPaths(originPath);
}
+ private boolean operateDataAuth(DataAuthPlan plan) throws ProcessorException
{
+ try {
+ if (plan.getOperatorType() == OperatorType.GRANT_DATA_AUTH) {
+ for (String user : plan.getUsers()) {
+ LocalFileAuthorizer.getInstance().setUserUseWaterMark(user, true);
+ }
+ } else {
+ for (String user : plan.getUsers()) {
+ LocalFileAuthorizer.getInstance().setUserUseWaterMark(user, false);
+ }
+ }
+ } catch (AuthException e) {
+ throw new ProcessorException("Grant or Revoke user data authority
failed, because " + e.getMessage());
+ }
+ return true;
+ }
+
private boolean operateAuthor(AuthorPlan author) throws ProcessorException {
AuthorOperator.AuthorType authorType = author.getAuthorType();
String userName = author.getUserName();
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
index 498b429..722b9fe 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
@@ -72,6 +72,6 @@ public abstract class Operator {
SET_STORAGE_GROUP, CREATE_TIMESERIES, DELETE_TIMESERIES, CREATE_USER,
DELETE_USER, MODIFY_PASSWORD,
GRANT_USER_PRIVILEGE, REVOKE_USER_PRIVILEGE, GRANT_USER_ROLE,
REVOKE_USER_ROLE, CREATE_ROLE,
DELETE_ROLE, GRANT_ROLE_PRIVILEGE, REVOKE_ROLE_PRIVILEGE, LIST_USER,
LIST_ROLE,
- LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, LIST_USER_ROLES, LIST_ROLE_USERS
+ LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, LIST_USER_ROLES,
LIST_ROLE_USERS, GRANT_DATA_AUTH, REVOKE_DATA_AUTH
}
}
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
new file mode 100644
index 0000000..e84a68c
--- /dev/null
+++
b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
@@ -0,0 +1,43 @@
+/**
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.iotdb.db.qp.logical.sys;
+
+import java.util.List;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.logical.RootOperator;
+
+public class DataAuthOperator extends RootOperator {
+
+ private final List<String> users;
+
+ public DataAuthOperator(int tokenIntType, List<String> users) {
+ super(tokenIntType);
+ if (tokenIntType == SQLConstant.TOK_GRANT_DATA_AUTH) {
+ operatorType = OperatorType.GRANT_DATA_AUTH;
+ } else {
+ operatorType = OperatorType.REVOKE_DATA_AUTH;
+ }
+ this.users = users;
+ }
+
+ public List<String> getUsers() {
+ return users;
+ }
+
+}
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
new file mode 100644
index 0000000..b9bb4d8
--- /dev/null
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
@@ -0,0 +1,43 @@
+/**
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.iotdb.db.qp.physical.sys;
+
+import java.util.List;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.tsfile.read.common.Path;
+
+public class DataAuthPlan extends PhysicalPlan {
+
+ private final List<String> users;
+
+ public DataAuthPlan(OperatorType operatorType, List<String> users) {
+ super(false, operatorType);
+ this.users = users;
+ }
+
+ public List<String> getUsers() {
+ return users;
+ }
+
+ @Override
+ public List<Path> getPaths() {
+ return null;
+ }
+}
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index 1efb56c..85dddd4 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.qp.strategy;
import static org.apache.iotdb.db.qp.constant.SQLConstant.LESSTHAN;
import static org.apache.iotdb.db.qp.constant.SQLConstant.LESSTHANOREQUALTO;
+import static org.apache.iotdb.db.qp.constant.SQLConstant.reverseWords;
import java.time.ZoneId;
import java.util.ArrayList;
@@ -35,6 +36,7 @@ import
org.apache.iotdb.db.exception.qp.QueryProcessorException;
import org.apache.iotdb.db.qp.constant.DatetimeUtils;
import org.apache.iotdb.db.qp.constant.SQLConstant;
import org.apache.iotdb.db.qp.constant.TSParserConstant;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
import org.apache.iotdb.db.qp.logical.RootOperator;
import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
import org.apache.iotdb.db.qp.logical.crud.DeleteOperator;
@@ -46,6 +48,7 @@ import org.apache.iotdb.db.qp.logical.crud.SFWOperator;
import org.apache.iotdb.db.qp.logical.crud.SelectOperator;
import org.apache.iotdb.db.qp.logical.crud.UpdateOperator;
import org.apache.iotdb.db.qp.logical.sys.AuthorOperator;
+import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator;
import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
@@ -177,6 +180,12 @@ public class LogicalGenerator {
case TSParser.TOK_GRANT:
analyzeAuthorGrant(astNode);
return;
+ case TSParser.TOK_GRANT_DATA_AUTH:
+ analyzeGrantDataAuth(astNode);
+ return;
+ case TSParser.TOK_REVOKE_DATA_AUTH:
+ analyzeRevokeDataAuth(astNode);
+ return;
case TSParser.TOK_REVOKE:
analyzeAuthorRevoke(astNode);
return;
@@ -983,6 +992,28 @@ public class LogicalGenerator {
initializedOperator = authorOperator;
}
+ private void analyzeGrantDataAuth(AstNode astNode) throws
IllegalASTFormatException {
+ int childCount = astNode.getChildCount();
+
+ List<String> users = new ArrayList<>();
+ for (int i = 0; i < childCount; i++) {
+ String user = astNode.getChild(i).getText();
+ users.add(user);
+ }
+ initializedOperator = new
DataAuthOperator(SQLConstant.TOK_GRANT_DATA_AUTH, users);
+ }
+
+ private void analyzeRevokeDataAuth(AstNode astNode) throws
IllegalASTFormatException {
+ int childCount = astNode.getChildCount();
+
+ List<String> users = new ArrayList<>();
+ for (int i = 0; i < childCount; i++) {
+ String user = astNode.getChild(i).getText();
+ users.add(user);
+ }
+ initializedOperator = new
DataAuthOperator(SQLConstant.TOK_REVOKE_DATA_AUTH, users);
+ }
+
private void analyzeAuthorGrant(AstNode astNode) throws
IllegalASTFormatException {
int childCount = astNode.getChildCount();
AuthorOperator authorOperator;
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index ffa0cdf..771c263 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
import org.apache.iotdb.db.qp.logical.crud.InsertOperator;
import org.apache.iotdb.db.qp.logical.crud.QueryOperator;
import org.apache.iotdb.db.qp.logical.sys.AuthorOperator;
+import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator;
import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
@@ -43,6 +44,7 @@ import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
@@ -76,6 +78,10 @@ public class PhysicalGenerator {
} catch (AuthException e) {
throw new QueryProcessorException(e);
}
+ case GRANT_DATA_AUTH:
+ case REVOKE_DATA_AUTH:
+ DataAuthOperator dataAuthOperator = (DataAuthOperator) operator;
+ return new DataAuthPlan(dataAuthOperator.getType(),
dataAuthOperator.getUsers());
case LOADDATA:
LoadDataOperator loadData = (LoadDataOperator) operator;
return new LoadDataPlan(loadData.getInputFilePath(),
loadData.getMeasureType());
diff --git
a/iotdb/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
b/iotdb/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
index 5cbc14b..3ec7413 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
@@ -26,12 +26,14 @@ import org.apache.iotdb.db.exception.ArgsErrorException;
import org.apache.iotdb.db.exception.ProcessorException;
import org.apache.iotdb.db.exception.qp.QueryProcessorException;
import org.apache.iotdb.db.qp.QueryProcessor;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
import org.apache.iotdb.db.qp.utils.MemIntQpExecutor;
@@ -48,6 +50,7 @@ import org.apache.iotdb.tsfile.read.filter.TimeFilter;
import org.apache.iotdb.tsfile.read.filter.ValueFilter;
import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
import org.apache.iotdb.tsfile.utils.StringContainer;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -274,4 +277,22 @@ public class PhysicalPlanTest {
}
+ @Test
+ public void testGrantDataAuth() throws QueryProcessorException,
ArgsErrorException, ProcessorException {
+ String sqlStr = "GRANT DATA_AUTHORITY to a,b";
+ PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+ DataAuthPlan dataAuthPlan = (DataAuthPlan) plan;
+ Assert.assertEquals(2, dataAuthPlan.getUsers().size());
+ Assert.assertEquals(OperatorType.GRANT_DATA_AUTH,
dataAuthPlan.getOperatorType());
+ }
+
+ @Test
+ public void testRevokeDataAuth() throws QueryProcessorException,
ArgsErrorException, ProcessorException {
+ String sqlStr = "revoke DATA_AUTHORITY from a,b";
+ PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+ DataAuthPlan dataAuthPlan = (DataAuthPlan) plan;
+ Assert.assertEquals(2, dataAuthPlan.getUsers().size());
+ Assert.assertEquals(OperatorType.REVOKE_DATA_AUTH,
dataAuthPlan.getOperatorType());
+ }
+
}