This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new bef8c899e RANGER-4483: added support for NOT_EQUALS in DB queries
bef8c899e is described below
commit bef8c899e6d76574bd09c1c4cd54864b3fce16a9
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Wed Oct 18 12:37:18 2023 -0700
RANGER-4483: added support for NOT_EQUALS in DB queries
---
.../org/apache/ranger/common/RangerSearchUtil.java | 36 ++----
.../org/apache/ranger/common/SearchCriteria.java | 6 +
.../java/org/apache/ranger/common/SearchField.java | 2 +-
.../java/org/apache/ranger/common/SearchUtil.java | 91 ++++++++------
.../apache/ranger/common/TestRangerSearchUtil.java | 134 +++++++++++++++++++++
5 files changed, 206 insertions(+), 63 deletions(-)
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
index e8aab9af5..5ddc965a4 100644
---
a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
+++
b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
@@ -270,9 +270,9 @@ public class RangerSearchUtil extends SearchUtil {
if (intFieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
whereClause.append(" and ")
-
.append(searchField.getFieldName())
- .append("=:")
-
.append(searchField.getClientFieldName());
+
.append(searchField.getFieldName())
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(searchField.getCustomCondition());
}
@@ -281,12 +281,9 @@ public class RangerSearchUtil extends SearchUtil {
String strFieldValue =
searchCriteria.getParam(searchField.getClientFieldName());
if (strFieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
- whereClause.append(" and
").append("LOWER(").append(searchField.getFieldName()).append(")");
- if (searchField.getSearchType()
== SearchField.SEARCH_TYPE.FULL) {
- whereClause.append("=
:").append(searchField.getClientFieldName());
- } else {
-
whereClause.append("like :").append(searchField.getClientFieldName());
- }
+ whereClause.append(" and
").append("LOWER(").append(searchField.getFieldName()).append(")")
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(searchField.getCustomCondition());
}
@@ -299,9 +296,9 @@ public class RangerSearchUtil extends SearchUtil {
if (boolFieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
whereClause.append(" and ")
-
.append(searchField.getFieldName())
- .append("=:")
-
.append(searchField.getClientFieldName());
+
.append(searchField.getFieldName())
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(searchField.getCustomCondition());
}
@@ -312,17 +309,9 @@ public class RangerSearchUtil extends SearchUtil {
null,
searchField.getClientFieldName(), null);
if (fieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
- whereClause.append(" and
").append(searchField.getFieldName());
- if
(SearchField.SEARCH_TYPE.LESS_THAN.equals(searchField.getSearchType())) {
- whereClause.append("<
:");
- } else if
(SearchField.SEARCH_TYPE.LESS_EQUAL_THAN.equals(searchField.getSearchType())) {
- whereClause.append("<=
:");
- } else if
(SearchField.SEARCH_TYPE.GREATER_THAN.equals(searchField.getSearchType())) {
- whereClause.append(">
:");
- } else if
(SearchField.SEARCH_TYPE.GREATER_EQUAL_THAN.equals(searchField.getSearchType()))
{
- whereClause.append(">=
:");
- }
-
whereClause.append(searchField.getClientFieldName());
+ whereClause.append(" and
").append(searchField.getFieldName())
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(searchField.getCustomCondition());
}
@@ -441,5 +430,4 @@ public class RangerSearchUtil extends SearchUtil {
}
return null;
}
-
}
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/SearchCriteria.java
b/security-admin/src/main/java/org/apache/ranger/common/SearchCriteria.java
index a919dc482..026e03dbc 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/SearchCriteria.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/SearchCriteria.java
@@ -50,6 +50,12 @@ public class SearchCriteria {
List<SearchGroup> searchGroups = new ArrayList<SearchGroup>();
+ public SearchCriteria() { }
+
+ public SearchCriteria(String paramName, Object paramValue) {
+ addParam(paramName, paramValue);
+ }
+
/**
* @return the startIndex
*/
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/SearchField.java
b/security-admin/src/main/java/org/apache/ranger/common/SearchField.java
index a53a75cc4..e51acc066 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/SearchField.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/SearchField.java
@@ -31,7 +31,7 @@ public class SearchField {
};
public enum SEARCH_TYPE {
- FULL, PARTIAL, LESS_THAN, LESS_EQUAL_THAN, GREATER_THAN,
GREATER_EQUAL_THAN
+ FULL, PARTIAL, LESS_THAN, LESS_EQUAL_THAN, GREATER_THAN,
GREATER_EQUAL_THAN, NOT_EQUALS
};
private String clientFieldName;
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/SearchUtil.java
b/security-admin/src/main/java/org/apache/ranger/common/SearchUtil.java
index 08002413c..8da2b47b6 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/SearchUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/SearchUtil.java
@@ -466,13 +466,8 @@ public class SearchUtil {
if (count > 0) {
whereClause.append(" or ");
}
- whereClause
-
.append(searchField.getFieldName())
-
.append(" = :")
-
.append(searchField
-
.getClientFieldName()
-
+ "_"
-
+ count);
+
whereClause.append(searchField.getFieldName())
+
.append("= :").append(searchField.getClientFieldName() + "_" + count);
}
if (intValueList.size()
> 1) {
@@ -481,10 +476,9 @@ public class SearchUtil {
} else {
whereClause.append("
and ")
-
.append(searchField.getFieldName())
-
.append(" in ( :")
-
.append(searchField.getClientFieldName())
-
.append(")");
+
.append(searchField.getFieldName())
+ .append(" in
")
+ .append("
(:").append(searchField.getClientFieldName()).append(")");
}
} else {
whereClause.append(" and
").append(
@@ -507,9 +501,9 @@ public class SearchUtil {
if (intFieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
whereClause.append(" and ")
-
.append(searchField.getFieldName())
- .append("=:")
-
.append(searchField.getClientFieldName());
+
.append(searchField.getFieldName())
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(
searchField.getCustomCondition());
@@ -520,15 +514,9 @@ public class SearchUtil {
.getClientFieldName());
if (strFieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
- whereClause.append(" and
").append("LOWER(")
-
.append(searchField.getFieldName()).append(")");
- if (searchField.getSearchType()
== SearchField.SEARCH_TYPE.FULL) {
- whereClause.append("=
:").append(
-
searchField.getClientFieldName());
- } else {
-
whereClause.append("like :").append(
-
searchField.getClientFieldName());
- }
+ whereClause.append(" and
").append("LOWER(").append(searchField.getFieldName()).append(")")
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(
searchField.getCustomCondition());
@@ -541,8 +529,8 @@ public class SearchUtil {
if (searchField.getCustomCondition() ==
null) {
whereClause.append(" and ")
.append(searchField.getFieldName())
- .append("=:")
-
.append(searchField.getClientFieldName());
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(
searchField.getCustomCondition());
@@ -553,18 +541,9 @@ public class SearchUtil {
.getClientFieldName());
if (fieldValue != null) {
if (searchField.getCustomCondition() ==
null) {
- whereClause.append(" and
").append(
-
searchField.getFieldName());
- if
(SearchField.SEARCH_TYPE.LESS_THAN.equals(searchField.getSearchType())) {
- whereClause.append("<
:");
- } else if
(SearchField.SEARCH_TYPE.LESS_EQUAL_THAN.equals(searchField.getSearchType())) {
- whereClause.append("<=
:");
- } else if
(SearchField.SEARCH_TYPE.GREATER_THAN.equals(searchField.getSearchType())) {
- whereClause.append(">
:");
- } else if
(SearchField.SEARCH_TYPE.GREATER_EQUAL_THAN.equals(searchField.getSearchType()))
{
- whereClause.append(">=
:");
- }
-
whereClause.append(searchField.getClientFieldName());
+ whereClause.append(" and
").append(searchField.getFieldName())
+
.append(getSqlOperator(searchField.getSearchType()))
+
.append(":").append(searchField.getClientFieldName());
} else {
whereClause.append(" and
").append(
searchField.getCustomCondition());
@@ -768,5 +747,41 @@ public class SearchUtil {
}
return value;
}
-
+
+ public String getSqlOperator(SearchField.SEARCH_TYPE searchType) {
+ final String ret;
+
+ switch (searchType) {
+ case PARTIAL:
+ ret = " like ";
+ break;
+
+ case LESS_THAN:
+ ret = " < ";
+ break;
+
+ case LESS_EQUAL_THAN:
+ ret = " <= ";
+ break;
+
+ case GREATER_THAN:
+ ret = " > ";
+ break;
+
+ case GREATER_EQUAL_THAN:
+ ret = " >= ";
+ break;
+
+ case NOT_EQUALS:
+ ret = " != ";
+ break;
+
+ case FULL:
+ default:
+ ret = " = ";
+ break;
+ }
+
+ return ret;
+ }
}
diff --git
a/security-admin/src/test/java/org/apache/ranger/common/TestRangerSearchUtil.java
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSearchUtil.java
new file mode 100644
index 000000000..8c73ebbea
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSearchUtil.java
@@ -0,0 +1,134 @@
+/*
+ * 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.ranger.common;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class TestRangerSearchUtil {
+ private final RangerSearchUtil searchUtil = new RangerSearchUtil();
+ private final List<SearchField> searchFields = new ArrayList<>();
+
+ private static final String SEARCH_PARAM_ID = "id";
+ private static final String SEARCH_PARAM_NAME = "name";
+ private static final String SEARCH_PARAM_NAME_CONTAINS =
"nameContains";
+ private static final String SEARCH_PARAM_IS_ENABLED =
"isEnabled";
+ private static final String SEARCH_PARAM_CREATED_TIME =
"createdTime";
+ private static final String SEARCH_PARAM_CREATED_TIME_FROM =
"createdTimeFrom";
+ private static final String SEARCH_PARAM_CREATED_TIME_TO =
"createdTimeTo";
+ private static final String SEARCH_PARAM_EXCLUDE_ID =
"excludeId";
+ private static final String SEARCH_PARAM_EXCLUDE_NAME =
"excludeName";
+
+ private static final String WHERE_PREFIX = "WHERE 1 = 1 ";
+ private static final String WHERE_PREFIX_AND = WHERE_PREFIX + " and ";
+
+ public TestRangerSearchUtil() {
+ searchFields.add(new SearchField(SEARCH_PARAM_ID,
"obj.id", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SEARCH_PARAM_NAME,
"obj.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SEARCH_PARAM_IS_ENABLED,
"obj.isEnabled", SearchField.DATA_TYPE.BOOLEAN,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SEARCH_PARAM_CREATED_TIME,
"obj.createdTime", SearchField.DATA_TYPE.DATE,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SEARCH_PARAM_NAME_CONTAINS,
"obj.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.PARTIAL));
+ searchFields.add(new
SearchField(SEARCH_PARAM_CREATED_TIME_FROM, "obj.createdTime",
SearchField.DATA_TYPE.DATE, SearchField.SEARCH_TYPE.GREATER_EQUAL_THAN));
+ searchFields.add(new SearchField(SEARCH_PARAM_CREATED_TIME_TO,
"obj.createdTime", SearchField.DATA_TYPE.DATE,
SearchField.SEARCH_TYPE.LESS_THAN));
+ searchFields.add(new SearchField(SEARCH_PARAM_EXCLUDE_ID,
"obj.id", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.NOT_EQUALS));
+ searchFields.add(new SearchField(SEARCH_PARAM_EXCLUDE_NAME,
"obj.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.NOT_EQUALS));
+ }
+
+ @Test
+ public void testEmptyCriteria() {
+ SearchCriteria criteria = new SearchCriteria();
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX, whereClause);
+ }
+
+ @Test
+ public void testIntEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_ID, 1);
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.id = :id",
whereClause);
+ }
+
+ @Test
+ public void testStringEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_NAME, "test-name");
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "LOWER(obj.name) =
:name", whereClause);
+ }
+
+ @Test
+ public void testBooleanEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_IS_ENABLED, false);
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.isEnabled =
:isEnabled", whereClause);
+ }
+
+ @Test
+ public void testDateEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_CREATED_TIME, new Date());
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.createdTime =
:createdTime", whereClause);
+ }
+
+ @Test
+ public void testStringContains() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_NAME_CONTAINS, "test-name");
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "LOWER(obj.name) like
:nameContains", whereClause);
+ }
+
+ @Test
+ public void testDateFrom() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_CREATED_TIME_FROM, new Date());
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.createdTime >=
:createdTimeFrom", whereClause);
+ }
+
+ @Test
+ public void testDateTo() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_CREATED_TIME_TO, new Date());
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.createdTime <
:createdTimeTo", whereClause);
+ }
+
+ @Test
+ public void testIntNotEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_EXCLUDE_ID, 1);
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "obj.id != :excludeId",
whereClause);
+ }
+
+ @Test
+ public void testStringNotEquals() {
+ SearchCriteria criteria = new
SearchCriteria(SEARCH_PARAM_EXCLUDE_NAME, "test-name");
+ String whereClause =
searchUtil.buildWhereClause(criteria, searchFields).toString();
+
+ Assert.assertEquals(WHERE_PREFIX_AND + "LOWER(obj.name) !=
:excludeName", whereClause);
+ }
+}
\ No newline at end of file