fixing full text search issue

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

Branch: refs/heads/develop
Commit: a6860dc491d23f59bdd489026853147f55596ed2
Parents: 6be0702
Author: scnakandala <supun.nakand...@gmail.com>
Authored: Tue Oct 18 14:59:28 2016 -0400
Committer: scnakandala <supun.nakand...@gmail.com>
Committed: Tue Oct 18 14:59:28 2016 -0400

----------------------------------------------------------------------
 .../db/repositories/AbstractRepository.java     | 10 ++++
 .../db/repositories/EntityRepository.java       | 55 +++++++++++---------
 .../main/resources/sharing-registry-derby.sql   |  1 +
 .../main/resources/sharing-registry-mysql.sql   |  1 +
 .../registry/SharingRegistryServiceTest.java    |  4 +-
 5 files changed, 45 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/a6860dc4/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/AbstractRepository.java
----------------------------------------------------------------------
diff --git 
a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/AbstractRepository.java
 
b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/AbstractRepository.java
index 9f5a706..ed99f62 100644
--- 
a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/AbstractRepository.java
+++ 
b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/AbstractRepository.java
@@ -121,6 +121,16 @@ public abstract class AbstractRepository<T, E, Id> {
         return gatewayList;
     }
 
+    public List<T> selectFromNativeQuery(String queryString, int offset, int 
limit) throws SharingRegistryException {
+        int newLimit = limit < 0 ? DBConstants.SELECT_MAX_ROWS: limit;
+        List resultSet = JPAUtils.execute(entityManager -> 
entityManager.createNativeQuery(queryString).setFirstResult(offset)
+                .setMaxResults(newLimit).getResultList());
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, 
thriftGenericClass)));
+        return gatewayList;
+    }
+
     public String getSelectQuery(Map<String, String> filters){
         String query = "SELECT DISTINCT p from " + 
dbEntityGenericClass.getSimpleName() + " as p";
         if(filters != null && filters.size() != 0){

http://git-wip-us.apache.org/repos/asf/airavata/blob/a6860dc4/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
----------------------------------------------------------------------
diff --git 
a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
 
b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
index 6064077..46a7cd0 100644
--- 
a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
+++ 
b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
@@ -20,10 +20,12 @@
 */
 package org.apache.airavata.sharing.registry.db.repositories;
 
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.sharing.registry.db.entities.EntityEntity;
 import org.apache.airavata.sharing.registry.db.entities.EntityPK;
-import org.apache.airavata.sharing.registry.db.entities.SharingEntity;
 import org.apache.airavata.sharing.registry.db.utils.DBConstants;
+import org.apache.airavata.sharing.registry.db.utils.JPAUtils;
 import org.apache.airavata.sharing.registry.models.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,48 +54,53 @@ public class EntityRepository extends 
AbstractRepository<Entity, EntityEntity, E
             groupIdString += groupId + "','";
         groupIdString = groupIdString.substring(0, groupIdString.length()-2);
 
-        String query = "SELECT DISTINCT E FROM " + 
EntityEntity.class.getSimpleName() + " E, " + 
SharingEntity.class.getSimpleName() + " S WHERE " +
-                "E." + DBConstants.EntityTable.ENTITY_ID + " = S." + 
DBConstants.SharingTable.ENTITY_ID + " AND " +
-                "E." + DBConstants.EntityTable.DOMAIN_ID + " = S." + 
DBConstants.SharingTable.DOMAIN_ID + " AND " +
-                "E." + DBConstants.EntityTable.DOMAIN_ID + " = '" + domainId + 
"' AND " +
-                "S." + DBConstants.SharingTable.GROUP_ID + " IN(" + 
groupIdString + ") AND E." + DBConstants.EntityTable.ENTITY_TYPE_ID + "='" +
-                entityTypeId + "' AND ";
+        String query = "SELECT E.* FROM ENTITY AS E INNER JOIN SHARING AS S ON 
(E.ENTITY_ID=S.ENTITY_ID AND E.DOMAIN_ID=S.DOMAIN_ID) WHERE " +
+                    "E.DOMAIN_ID = '" + domainId + "' AND " + "S.GROUP_ID IN(" 
+ groupIdString + ") AND E." +
+                    "ENTITY_TYPE_ID" + "='" + entityTypeId + "' AND ";
 
         for(SearchCriteria searchCriteria : filters){
             if(searchCriteria.getSearchField().equals(EntitySearchField.NAME)){
-                query += "E." + DBConstants.EntityTable.NAME + " LIKE '%" + 
searchCriteria.getValue() + "%' AND ";
+                query += "E.NAME LIKE '%" + searchCriteria.getValue() + "%' 
AND ";
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.DESCRIPTION)){
-                query += "E." + DBConstants.EntityTable.DESCRIPTION + " LIKE 
'%" + searchCriteria.getValue() + "%' AND ";
+                query += "E.DESCRIPTION LIKE '%" + searchCriteria.getValue() + 
"%' AND ";
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.PERMISSION_TYPE_ID)){
-                query += "S." + DBConstants.SharingTable.PERMISSION_TYPE_ID + 
" = '" + searchCriteria.getValue() + "' AND ";
+                query += "S.PERMISSION_TYPE_ID = '" + 
searchCriteria.getValue() + "' AND ";
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.FULL_TEXT)){
-                //FULL TEXT Search with Query Expansion
-                String queryTerms = "";
-                for(String word : 
searchCriteria.getValue().trim().replaceAll(" +", " ").split(" ")){
-                    queryTerms += queryTerms + " +" + word;
+                try {
+                    
if(ServerSettings.getSetting(JPAUtils.SHARING_REG_JDBC_DRIVER).contains("derby")){
+                        query += "E.FULL_TEXT LIKE '%" + 
searchCriteria.getValue() + "%' AND ";
+                    }else{
+                        //FULL TEXT Search with Query Expansion
+                        String queryTerms = "";
+                        for(String word : 
searchCriteria.getValue().trim().replaceAll(" +", " ").split(" ")){
+                            queryTerms += queryTerms + " +" + word;
+                        }
+                        queryTerms = queryTerms.trim();
+                        query += "MATCH(E.FULL_TEXT) AGAINST ('" + queryTerms
+                                + "' IN BOOLEAN MODE) AND ";
+                    }
+                } catch (ApplicationSettingsException e) {
+                    logger.error(e.getMessage(), e);
+                    throw new SharingRegistryException(e.getMessage());
                 }
-                queryTerms = queryTerms.trim();
-                query += "MATCH(E." + DBConstants.EntityTable.FULL_TEXT + ") 
AGAINST ('" + queryTerms
-                        + "' IN BOOLEAN MODE WITH QUERY EXPANSION) AND ";
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.PARRENT_ENTITY_ID)){
-                query += "E." + DBConstants.EntityTable.PARENT_ENTITY_ID + " = 
'" + searchCriteria.getValue() + "' AND ";
+                query += "E.PARENT_ENTITY_ID = '" + searchCriteria.getValue() 
+ "' AND ";
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.CREATED_TIME)){
                 
if(searchCriteria.getSearchCondition().equals(SearchCondition.GTE)){
-                    query += "E." + DBConstants.EntityTable.CREATED_TIME + " 
>= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.CREATED_TIME >= " + 
Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
                 }else{
-                    query += "E." + DBConstants.EntityTable.CREATED_TIME + " 
<= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.CREATED_TIME <= " + 
Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
                 }
             }else 
if(searchCriteria.getSearchField().equals(EntitySearchField.UPDATED_TIME)){
                 
if(searchCriteria.getSearchCondition().equals(SearchCondition.GTE)){
-                    query += "E." + DBConstants.EntityTable.UPDATED_TIME + " 
>= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.UPDATED_TIME >= " + 
Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
                 }else{
-                    query += "E." + DBConstants.EntityTable.UPDATED_TIME + " 
<= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.UPDATED_TIME <= " + 
Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
                 }
             }
         }
-
         query = query.substring(0, query.length() - 5);
-        return select(query, offset, limit);
+        return selectFromNativeQuery(query, offset, limit);
     }
 
     public String getSelectQuery(Map<String, String> filters){

http://git-wip-us.apache.org/repos/asf/airavata/blob/a6860dc4/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
----------------------------------------------------------------------
diff --git 
a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
 
b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
index 923894e..19389c9 100644
--- 
a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
+++ 
b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
@@ -123,6 +123,7 @@ CREATE TABLE SHARING (
   UPDATED_TIME BIGINT NOT NULL,
   PRIMARY KEY (PERMISSION_TYPE_ID, ENTITY_ID, GROUP_ID, DOMAIN_ID, 
INHERITED_PARENT_ID),
   FOREIGN KEY (PERMISSION_TYPE_ID, DOMAIN_ID) REFERENCES 
PERMISSION_TYPE(PERMISSION_TYPE_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO 
ACTION,
+  FOREIGN KEY (ENTITY_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, DOMAIN_ID) 
ON DELETE CASCADE ON UPDATE NO ACTION,
   FOREIGN KEY (INHERITED_PARENT_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, 
DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
   FOREIGN KEY (GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) 
ON DELETE CASCADE ON UPDATE NO ACTION
 );

http://git-wip-us.apache.org/repos/asf/airavata/blob/a6860dc4/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
----------------------------------------------------------------------
diff --git 
a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
 
b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
index 9bfe64a..7697d52 100644
--- 
a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
+++ 
b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
@@ -123,6 +123,7 @@ CREATE TABLE SHARING (
   UPDATED_TIME BIGINT NOT NULL,
   PRIMARY KEY (PERMISSION_TYPE_ID, ENTITY_ID, GROUP_ID, DOMAIN_ID, 
INHERITED_PARENT_ID),
   FOREIGN KEY (PERMISSION_TYPE_ID, DOMAIN_ID) REFERENCES 
PERMISSION_TYPE(PERMISSION_TYPE_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO 
ACTION,
+  FOREIGN KEY (ENTITY_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, DOMAIN_ID) 
ON DELETE CASCADE ON UPDATE NO ACTION,
   FOREIGN KEY (INHERITED_PARENT_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, 
DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
   FOREIGN KEY (GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) 
ON DELETE CASCADE ON UPDATE NO ACTION
 );

http://git-wip-us.apache.org/repos/asf/airavata/blob/a6860dc4/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServiceTest.java
----------------------------------------------------------------------
diff --git 
a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServiceTest.java
 
b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServiceTest.java
index df9a556..9802113 100644
--- 
a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServiceTest.java
+++ 
b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServiceTest.java
@@ -49,7 +49,7 @@ public class SharingRegistryServiceTest {
 
 
     @Test
-    public void test() throws TException {
+    public void test() throws TException, InterruptedException {
         String serverHost = "localhost";
         int serverPort = 7878;
 
@@ -249,7 +249,7 @@ public class SharingRegistryServiceTest {
         entity3.setName("test-experiment-2");
         entity3.setDescription("test experiment 2 description");
         entity3.setParentEntityId("test-project-1");
-        entity3.setFullText("test experiment 1 3-methyl 1-butanol");
+        entity3.setFullText("test experiment 1 3-methyl 1-butanol stampede");
         sharingServiceClient.createEntity(entity3);
 
         Entity entity4 = new Entity();

Reply via email to