Repository: incubator-cmda
Updated Branches:
  refs/heads/master 391a7a7f1 -> edcdd4084


Update Backend: Add APIs in knowlege graph to support shortest path; Add length 
feature to edges; Add search query for datasetLog based on knowledge graph


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

Branch: refs/heads/master
Commit: edcdd408472a085fdee120800411fde7e6e4c853
Parents: 391a7a7
Author: mingqi830 <m...@andrew.cmu.edu>
Authored: Fri Nov 20 16:39:21 2015 -0800
Committer: mingqi830 <m...@andrew.cmu.edu>
Committed: Fri Nov 20 16:39:21 2015 -0800

----------------------------------------------------------------------
 ApacheCMDA_Backend_1.0/app/.DS_Store            | Bin 6148 -> 6148 bytes
 .../app/controllers/AnalyticsController.java    | 150 ++++++------
 .../app/controllers/DatasetLogController.java   | 226 ++++++++++++++++++-
 .../controllers/GraphAlgorithmController.java   | 220 ++++++++++++++++++
 .../ServiceExecutionLogController.java          |   5 +-
 .../app/models/DatasetAndUserRepository.java    |   2 +
 .../app/models/DatasetLog.java                  |  43 +++-
 .../app/models/DatasetLogRepository.java        |   5 +
 .../app/models/ServiceAndDatasetRepository.java |   3 +-
 .../app/models/ServiceAndUserRepository.java    |   3 +-
 .../app/util/HashMapUtil.java                   |  55 +++++
 ApacheCMDA_Backend_1.0/build.sbt                |   6 +-
 ApacheCMDA_Backend_1.0/conf/.DS_Store           | Bin 6148 -> 6148 bytes
 ApacheCMDA_Backend_1.0/conf/routes              |  14 +-
 ApacheCMDA_Backend_1.0/test/DatasetLogTest.java |   7 +-
 .../test/ServiceExecutionLogTest.java           |   9 +-
 16 files changed, 648 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/.DS_Store
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/.DS_Store 
b/ApacheCMDA_Backend_1.0/app/.DS_Store
index 01d5243..e8a7ea5 100644
Binary files a/ApacheCMDA_Backend_1.0/app/.DS_Store and 
b/ApacheCMDA_Backend_1.0/app/.DS_Store differ

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
index f5f44d4..713aacc 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
@@ -9,6 +9,8 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.springframework.data.domain.Sort;
+
 import models.ClimateService;
 import models.ClimateServiceRepository;
 import models.Dataset;
@@ -23,6 +25,7 @@ import models.User;
 import models.UserRepository;
 import play.mvc.Controller;
 import play.mvc.Result;
+import util.HashMapUtil;
 import util.Matrix;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -82,7 +85,7 @@ public class AnalyticsController extends Controller {
                case "UserUserDataset": {
                        relations = new int[count1][count3];
                        Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (datasetAndUsers == null) {
                                System.out.println("User and Dataset: cannot be 
found!");
@@ -105,7 +108,7 @@ public class AnalyticsController extends Controller {
                case "UserUserService": {
                        relations = new int[count1][count3];
                        Iterable<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (serviceAndUsers == null) {
                                System.out.println("User and Service: cannot be 
found!");
@@ -128,7 +131,7 @@ public class AnalyticsController extends Controller {
                case "DatasetDatasetUser": {
                        relations = new int[count1][count3];
                        Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (datasetAndUsers == null) {
                                System.out.println("User and Dataset: cannot be 
found!");
@@ -151,7 +154,7 @@ public class AnalyticsController extends Controller {
                case "DatasetDatasetService": {
                        relations = new int[count1][count3];
                        Iterable<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (datasetAndServices == null) {
                                System.out.println("Dataset and Service: cannot 
be found!");
@@ -174,7 +177,7 @@ public class AnalyticsController extends Controller {
                case "ServiceServiceUser": {
                        relations = new int[count1][count3];
                        Iterable<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (serviceAndUsers == null) {
                                System.out.println("User and Service: cannot be 
found!");
@@ -197,7 +200,7 @@ public class AnalyticsController extends Controller {
                case "ServiceServiceDataset": {
                        relations = new int[count1][count3];
                        Iterable<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
-                                       .findAll();
+                                       .findAll(sortByCountDesc());
 
                        if (datasetAndServices == null) {
                                System.out.println("Dataset and Service: cannot 
be found!");
@@ -259,13 +262,13 @@ public class AnalyticsController extends Controller {
 
        public Map<String, Object> getAllServiceAndDatasetWithCount() {
 
-               Iterable<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
-                               .findAll();
+               List<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
+                               .findAll(sortByCountDesc());
 
                if (datasetAndServices == null) {
                        System.out.println("Dataset and Service: cannot be 
found!");
                }
-
+               
                Map<String, Object> map = 
jsonFormatServiceAndDataset(datasetAndServices);
                return map;
 
@@ -273,8 +276,8 @@ public class AnalyticsController extends Controller {
 
        public Map<String, Object> getAllDatasetAndUserWithCount() {
 
-               Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
-                               .findAll();
+               List<DatasetAndUser> datasetAndUsers = datasetAndUserRepository
+                               .findAll(sortByCountDesc());
 
                if (datasetAndUsers == null) {
                        System.out.println("User and Dataset: cannot be 
found!");
@@ -286,8 +289,8 @@ public class AnalyticsController extends Controller {
 
        public Map<String, Object> getAllServiceAndUserWithCount() {
 
-               Iterable<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
-                               .findAll();
+               List<ServiceAndUser> serviceAndUsers = serviceAndUserRepository
+                               .findAll(sortByCountDesc());
 
                if (serviceAndUsers == null) {
                        System.out.println("User and Service: cannot be 
found!");
@@ -301,7 +304,7 @@ public class AnalyticsController extends Controller {
 
                try {
                        User user = userRepository.findOne(userId);
-                       Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
+                       List<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
                                        .findByUser(user);
 
                        if (datasetAndUsers == null) {
@@ -322,12 +325,12 @@ public class AnalyticsController extends Controller {
                }
        }
 
-       public Result getOneDatasetWithAllDatasetAndCount(long datasetId,
+       public Result getOneDatasetWithAllUserAndCount(long datasetId,
                        String format) {
 
                try {
                        Dataset dataset = datasetRepository.findOne(datasetId);
-                       Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
+                       List<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository
                                        .findByDataset(dataset);
 
                        if (datasetAndUsers == null) {
@@ -352,7 +355,7 @@ public class AnalyticsController extends Controller {
 
                try {
                        User user = userRepository.findOne(userId);
-                       Iterable<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
+                       List<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
                                        .findByUser(user);
 
                        if (serviceAndUsers == null) {
@@ -377,7 +380,7 @@ public class AnalyticsController extends Controller {
 
                try {
                        ClimateService service = 
serviceRepository.findOne(serviceId);
-                       Iterable<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
+                       List<ServiceAndUser> serviceAndUsers = 
serviceAndUserRepository
                                        .findByClimateService(service);
 
                        if (serviceAndUsers == null) {
@@ -403,7 +406,7 @@ public class AnalyticsController extends Controller {
 
                try {
                        ClimateService service = 
serviceRepository.findOne(serviceId);
-                       Iterable<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
+                       List<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
                                        .findByClimateService(service);
 
                        if (datasetAndServices == null) {
@@ -429,7 +432,7 @@ public class AnalyticsController extends Controller {
 
                try {
                        Dataset dataset = datasetRepository.findOne(datasetId);
-                       Iterable<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
+                       List<ServiceAndDataset> datasetAndServices = 
serviceAndDatasetRepository
                                        .findByDataset(dataset);
 
                        if (datasetAndServices == null) {
@@ -451,12 +454,14 @@ public class AnalyticsController extends Controller {
        }
 
        private Map<String, Object> jsonFormatUserAndDataset(
-                       Iterable<DatasetAndUser> userDatasets) {
-
+                       List<DatasetAndUser> userDatasets) {
+               long min = userDatasets.get(userDatasets.size()-1).getCount();
+               long max = userDatasets.get(0).getCount();
                List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
                List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
 
                int i = 1;
+               int edgeId = 1;
                for (DatasetAndUser userDataset : userDatasets) {
                        int source = 0;
                        int target = 0;
@@ -472,7 +477,7 @@ public class AnalyticsController extends Controller {
                        if (source == 0) {
                                String realName = 
userDataset.getUser().getFirstName() + " "
                                                + 
userDataset.getUser().getLastName();
-                               nodes.add(map7("id", i, "title", realName, 
"label", userDataset
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
realName, "label", userDataset
                                                .getUser().getUserName(), 
"cluster", "1", "value", 1,
                                                "group", "user", "userId", 
userDataset.getUser()
                                                                .getId()));
@@ -490,7 +495,7 @@ public class AnalyticsController extends Controller {
                                }
                        }
                        if (target == 0) {
-                               nodes.add(map7("id", i, "title", 
userDataset.getDataset()
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
userDataset.getDataset()
                                                .getName(), "label",
                                                
userDataset.getDataset().getName(), "cluster", "2",
                                                "value", 2, "group", "dataset", 
"datasetId",
@@ -498,20 +503,24 @@ public class AnalyticsController extends Controller {
                                target = i;
                                i++;
                        }
-                       rels.add(map3("from", source, "to", target, "title", 
"USE"));
-
+                       rels.add(HashMapUtil.map6("from", source, "to", target, 
"title", "USE",
+                                       "id", edgeId, "weight", 
userDataset.getCount(), "length", (max-min)*3/userDataset.getCount()));
+                       edgeId++;
                }
 
-               return map("nodes", nodes, "edges", rels);
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
        }
 
        private Map<String, Object> jsonFormatServiceAndDataset(
-                       Iterable<ServiceAndDataset> serviceDatasets) {
-
+                       List<ServiceAndDataset> serviceDatasets) {
+               
+               long min = 
serviceDatasets.get(serviceDatasets.size()-1).getCount();
+               long max = serviceDatasets.get(0).getCount();
                List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
                List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
 
                int i = 1;
+               int edgeId = 1;
                for (ServiceAndDataset serviceDataset : serviceDatasets) {
                        int source = 0;
                        int target = 0;
@@ -525,7 +534,7 @@ public class AnalyticsController extends Controller {
                                }
                        }
                        if (source == 0) {
-                               nodes.add(map7("id", i, "title", serviceDataset
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
serviceDataset
                                                .getClimateService().getName(), 
"label", serviceDataset
                                                .getClimateService().getName(), 
"cluster", "3",
                                                "value", 1, "group", "service", 
"serviceId",
@@ -543,7 +552,7 @@ public class AnalyticsController extends Controller {
                                }
                        }
                        if (target == 0) {
-                               nodes.add(map7("id", i, "title", 
serviceDataset.getDataset()
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
serviceDataset.getDataset()
                                                .getName(), "label", 
serviceDataset.getDataset()
                                                .getName(), "cluster", "2", 
"value", 2, "group",
                                                "dataset", "datasetId", 
serviceDataset.getDataset()
@@ -552,20 +561,24 @@ public class AnalyticsController extends Controller {
                                i++;
                        }
 
-                       rels.add(map3("from", source, "to", target, "title", 
"Utilize"));
-
+                       rels.add(HashMapUtil.map6("from", source, "to", target, 
"title", "Utilize",
+                                       "id", edgeId, "weight", 
serviceDataset.getCount(), "length", (max-min)*3/serviceDataset.getCount()));
+                       edgeId++;
                }
 
-               return map("nodes", nodes, "edges", rels);
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
        }
 
        private Map<String, Object> jsonFormatServiceAndUser(
-                       Iterable<ServiceAndUser> userServices) {
-
+                       List<ServiceAndUser> userServices) {
+               
+               long min = userServices.get(userServices.size()-1).getCount();
+               long max = userServices.get(0).getCount();
                List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
                List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
 
                int i = 1;
+               int edgeId = 1;
                for (ServiceAndUser userService : userServices) {
                        int source = 0;
                        int target = 0;
@@ -580,9 +593,8 @@ public class AnalyticsController extends Controller {
                        }
                        if (source == 0) {
                                String realName = 
userService.getUser().getFirstName() + " "
-                                               + 
userService.getUser().getMiddleInitial() + " "
                                                + 
userService.getUser().getLastName();
-                               nodes.add(map7("id", i, "title", realName, 
"label", userService
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
realName, "label", userService
                                                .getUser().getUserName(), 
"cluster", "1", "value", 1,
                                                "group", "user", "userId", 
userService.getUser()
                                                                .getId()));
@@ -599,7 +611,7 @@ public class AnalyticsController extends Controller {
                                }
                        }
                        if (target == 0) {
-                               nodes.add(map7("id", i, "title", userService
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
userService
                                                .getClimateService().getName(), 
"label", userService
                                                .getClimateService().getName(), 
"cluster", "3",
                                                "value", 2, "group", "service", 
"serviceId",
@@ -608,11 +620,12 @@ public class AnalyticsController extends Controller {
                                i++;
                        }
 
-                       rels.add(map3("from", source, "to", target, "title", 
"USE"));
-
+                       rels.add(HashMapUtil.map6("from", source, "to", target, 
"title", "USE",
+                                       "id", edgeId, "weight", 
userService.getCount(), "length", (max-min)*4/userService.getCount()));
+                       edgeId ++;
                }
 
-               return map("nodes", nodes, "edges", rels);
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
        }
        
        public String findTitleName(String param, long id) {
@@ -639,6 +652,7 @@ public class AnalyticsController extends Controller {
                List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
 
                int i = 1;
+               int edgeId = 1;
                for (int m = 0; m < matrix.length; m++) {
                        for (int n = m + 1; n < matrix[0].length; n++) {
                                if (matrix[m][n] > 0) {
@@ -654,7 +668,7 @@ public class AnalyticsController extends Controller {
                                        }
                                        if (source == 0) {
                                                String name = 
findTitleName(param, (long)m+1);
-                                               nodes.add(map7("id", i, 
"title", name, "label",
+                                               
nodes.add(HashMapUtil.map7("id", i, "title", name, "label",
                                                                name, 
"cluster", "1", "value", 1, "group",
                                                                param, param + 
"Id", (long)m + 1));
                                                source = i;
@@ -669,49 +683,29 @@ public class AnalyticsController extends Controller {
                                        }
                                        if (target == 0) {
                                                String name = 
findTitleName(param, (long)n+1);
-                                               nodes.add(map7("id", i, 
"title", name, "label",
+                                               
nodes.add(HashMapUtil.map7("id", i, "title", name, "label",
                                                                name, 
"cluster", "1", "value", 1, "group",
                                                                param, param + 
"Id", (long)n + 1));
                                                target = i;
                                                i++;
                                        }
-                                       rels.add(map3("from", source, "to", 
target, "title", "RELATE"));
+                                       int zoom = 0;
+                                       if(param.equals("dataset")) {
+                                               zoom = 1600;
+                                       } else {
+                                               zoom = 6000;
+                                       }
+                                       rels.add(HashMapUtil.map6("from", 
source, "to", target, "title", "RELATE",
+                                                       "id", edgeId, "weight", 
matrix[m][n], "length", zoom/matrix[m][n]));
+                                       edgeId ++;
                                }
                        }
                }
 
-               return map("nodes", nodes, "edges", rels);
-       }
-
-       private Map<String, Object> map(String key1, Object value1, String key2,
-                       Object value2) {
-               Map<String, Object> result = new HashMap<String, Object>(2);
-               result.put(key1, value1);
-               result.put(key2, value2);
-               return result;
-       }
-
-       private Map<String, Object> map3(String key1, Object value1, String 
key2,
-                       Object value2, String key3, Object value3) {
-               Map<String, Object> result = new HashMap<String, Object>(3);
-               result.put(key1, value1);
-               result.put(key2, value2);
-               result.put(key3, value3);
-               return result;
-       }
-
-       private Map<String, Object> map7(String key1, Object value1, String 
key2,
-                       Object value2, String key3, Object value3, String key4,
-                       Object value4, String key5, Object value5, String key6,
-                       Object value6, String key7, Object value7) {
-               Map<String, Object> result = new HashMap<String, Object>(6);
-               result.put(key1, value1);
-               result.put(key2, value2);
-               result.put(key3, value3);
-               result.put(key4, value4);
-               result.put(key5, value5);
-               result.put(key6, value6);
-               result.put(key7, value7);
-               return result;
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
        }
+       
+       private Sort sortByCountDesc() {
+        return new Sort(Sort.Direction.DESC, "count");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
index f92b68e..e53e197 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
@@ -2,7 +2,14 @@ package controllers;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -12,6 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.google.gson.Gson;
 
 import models.Dataset;
+import models.DatasetAndUser;
 import models.DatasetLog;
 import models.DatasetLogRepository;
 import models.DatasetRepository;
@@ -20,6 +28,7 @@ import models.ServiceExecutionLogRepository;
 import models.User;
 import models.UserRepository;
 import play.mvc.*;
+import util.HashMapUtil;
 
 @Named
 @Singleton
@@ -86,10 +95,13 @@ public class DatasetLogController extends Controller {
                        Dataset outputDataset = 
datasetRepository.findOne(outputDatasetId);
                        Dataset dataset = datasetRepository.findOne(datasetId);
                        ServiceExecutionLog serviceExecutionLog = 
serviceExecutionLogRepository.findOne(serviceExecutionLogId);
+                       Date serviceExecutionStartTime = 
serviceExecutionLog.getExecutionStartTime();           
+                       Date serviceExecutionEndTime = 
serviceExecutionLog.getExecutionEndTime();
                        User user = userRepository.findOne(userId);
                        DatasetLog datasetLog = new 
DatasetLog(serviceExecutionLog,
                                        dataset, user, plotUrl, dataUrl, 
originalDataset,
-                                       outputDataset, datasetStudyStartTime, 
datasetStudyEndTime);
+                                       outputDataset, 
serviceExecutionStartTime, serviceExecutionEndTime,
+                                       datasetStudyStartTime, 
datasetStudyEndTime);
                        DatasetLog saveddatasetLog = 
datasetLogRepository.save(datasetLog);
                        System.out.println("DatasetLog saved: "+ 
saveddatasetLog.getId());
                        return created(new Gson().toJson(datasetLog.getId()));
@@ -206,5 +218,215 @@ public class DatasetLogController extends Controller {
                return badRequest("DatasetLog not found");
        }
     }
-       
+    
+    public Result queryDatasets() {
+       JsonNode json = request().body().asJson();
+               Set<Dataset> datasets = new HashSet<Dataset>();
+               Map<String, Object> map = new HashMap<>();
+               
+               if (json == null) {
+                       System.out.println("Dataset cannot be queried, 
expecting Json data");
+                       String result = new Gson().toJson(map);
+                       return ok(result);
+               }
+
+               try {
+                       // Parse JSON file
+                       Long userId = json.findPath("id").asLong();
+
+                       Date start = new Date(0);
+                       Date end = new Date();
+                       long executionStartTimeNumber = 
json.findPath("executionStartTime")
+                                       .asLong();
+                       long executionEndTimeNumber = 
json.findPath("executionEndTime")
+                                       .asLong();
+                       
+                       if (executionStartTimeNumber > 0) {
+                               start = new Date(executionStartTimeNumber);
+                       }
+                       if (executionEndTimeNumber > 0) {
+                               end = new Date(executionEndTimeNumber);
+                       }
+                       
+                       List<DatasetLog> datasetLogs = datasetLogRepository.
+                                       
findByServiceExecutionStartTimeGreaterThanEqualAndServiceExecutionEndTimeLessThanEqualAndUser_Id(start,
 end, userId);
+//                     for (DatasetLog datasetLog : datasetLogs) {
+//                             datasets.add(datasetLog.getDataset());
+//                     }
+                       map = jsonFormatUserAndDataset(datasetLogs);
+               } catch (Exception e) {
+                       System.out.println("Dataset cannot be queried, query is 
corrupt");
+                       String result = new Gson().toJson(map);
+                       return ok(result);
+               }
+               
+               String result = new Gson().toJson(map);
+               return ok(result);
+    }
+    
+    private Map<String, Object> jsonFormatUserAndDataset(
+                       Iterable<DatasetLog> userDatasets) {
+
+               List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
+               List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
+
+               int i = 1;
+               int edgeId = 1;
+               for (DatasetLog userDataset : userDatasets) {
+                       int source = 0;
+                       int target = 0;
+                       // Check whether the current user has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("user")
+                                               && (long) 
nodes.get(j).get("userId") == userDataset
+                                                               
.getUser().getId()) {
+                                       source = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (source == 0) {
+                               String realName = 
userDataset.getUser().getFirstName() + " "
+                                               + 
userDataset.getUser().getLastName();
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
realName, "label", userDataset
+                                               .getUser().getUserName(), 
"cluster", "1", "value", 1,
+                                               "group", "user", "userId", 
userDataset.getUser()
+                                                               .getId()));
+
+                               source = i;
+                               i++;
+                       }
+                       // Check whether the current dataset has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("dataset")
+                                               && (long) 
nodes.get(j).get("datasetId") == userDataset
+                                                               
.getDataset().getId()) {
+                                       target = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (target == 0) {
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
userDataset.getDataset()
+                                               .getName(), "label",
+                                               
userDataset.getDataset().getName(), "cluster", "2",
+                                               "value", 2, "group", "dataset", 
"datasetId",
+                                               
userDataset.getDataset().getId()));
+                               target = i;
+                               i++;
+                       }
+                       rels.add(HashMapUtil.map5("from", source, "to", target, 
"title", "USE",
+                                       "id", edgeId, "weight", 0));
+                       edgeId++;
+               }
+
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
+       }
+    
+    public Result queryVariables() {
+       JsonNode json = request().body().asJson();
+               Set<Dataset> datasets = new HashSet<Dataset>();
+               Set<String> variables = new HashSet<String>();
+               Map<String, Object> map = new HashMap<>();
+               
+               if (json == null) {
+                       System.out.println("Dataset cannot be queried, 
expecting Json data");
+                       String result = new Gson().toJson(map);
+                       return ok(result);
+               }
+
+               try {
+                       // Parse JSON file
+                       Long userId = json.findPath("userId").asLong();
+
+                       Date start = new Date(0);
+                       Date end = new Date();
+                       long executionStartTimeNumber = 
json.findPath("executionStartTime")
+                                       .asLong();
+                       long executionEndTimeNumber = 
json.findPath("executionEndTime")
+                                       .asLong();
+
+                       if (executionStartTimeNumber > 0) {
+                               start = new Date(executionStartTimeNumber);
+                       }
+                       if (executionEndTimeNumber > 0) {
+                               end = new Date(executionEndTimeNumber);
+                       }
+                       
+                       List<DatasetLog> datasetLogs = datasetLogRepository.
+                                       
findByServiceExecutionStartTimeGreaterThanEqualAndServiceExecutionEndTimeLessThanEqualAndUser_Id(start,
 end, userId);
+                       
+//                     for (DatasetLog datasetLog : datasetLogs) {
+//                             datasets.add(datasetLog.getDataset());
+//                     }
+//                     
+//                     for (Dataset dataset : datasets) {
+//                             variables.add(dataset.getPhysicalVariable());
+//                     }
+                       map = jsonFormatUserAndVariable(datasetLogs);
+                       
+               } catch (Exception e) {
+                       System.out.println("Dataset cannot be queried, query is 
corrupt");
+                       String result = new Gson().toJson(map);
+                       return ok(result);
+               }
+               
+               String result = new Gson().toJson(new 
ArrayList<String>(variables));
+               return ok(result);
+    }
+    
+    private Map<String, Object> jsonFormatUserAndVariable (
+                       Iterable<DatasetLog> userDatasets) {
+
+               List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
+               List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
+
+               int i = 1;
+               int edgeId = 1;
+               for (DatasetLog userDataset : userDatasets) {
+                       int source = 0;
+                       int target = 0;
+                       // Check whether the current user has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("user")
+                                               && (long) 
nodes.get(j).get("userId") == userDataset
+                                                               
.getUser().getId()) {
+                                       source = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (source == 0) {
+                               String realName = 
userDataset.getUser().getFirstName() + " "
+                                               + 
userDataset.getUser().getLastName();
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
realName, "label", userDataset
+                                               .getUser().getUserName(), 
"cluster", "1", "value", 1,
+                                               "group", "user", "userId", 
userDataset.getUser()
+                                                               .getId()));
+
+                               source = i;
+                               i++;
+                       }
+                       // Check whether the current dataset has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("dataset")
+                                               && (long) 
nodes.get(j).get("datasetId") == userDataset
+                                                               
.getDataset().getId()) {
+                                       target = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (target == 0) {
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
userDataset.getDataset()
+                                               .getName(), "label",
+                                               
userDataset.getDataset().getPhysicalVariable(), "cluster", "2",
+                                               "value", 2, "group", "dataset", 
"datasetId",
+                                               
userDataset.getDataset().getId()));
+                               target = i;
+                               i++;
+                       }
+                       rels.add(HashMapUtil.map5("from", source, "to", target, 
"title", "USE",
+                                       "id", edgeId, "weight", 0));
+                       edgeId++;
+               }
+
+               return HashMapUtil.map("nodes", nodes, "edges", rels);
+       }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/controllers/GraphAlgorithmController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Backend_1.0/app/controllers/GraphAlgorithmController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/GraphAlgorithmController.java
new file mode 100644
index 0000000..c240e5a
--- /dev/null
+++ b/ApacheCMDA_Backend_1.0/app/controllers/GraphAlgorithmController.java
@@ -0,0 +1,220 @@
+package controllers;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jgrapht.GraphPath;
+import org.jgrapht.WeightedGraph;
+import org.jgrapht.alg.DijkstraShortestPath;
+import org.jgrapht.alg.KShortestPaths;
+import org.jgrapht.graph.DefaultWeightedEdge;
+import org.jgrapht.graph.SimpleWeightedGraph;
+
+import models.ClimateService;
+import models.ClimateServiceRepository;
+import models.Dataset;
+import models.DatasetAndUser;
+import models.DatasetAndUserRepository;
+import models.DatasetRepository;
+import models.ServiceAndDataset;
+import models.ServiceAndDatasetRepository;
+import models.ServiceAndUser;
+import models.ServiceAndUserRepository;
+import models.User;
+import models.UserRepository;
+import play.mvc.Controller;
+import play.mvc.Result;
+import util.HashMapUtil;
+import util.Matrix;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.Gson;
+
+@Named
+@Singleton
+public class GraphAlgorithmController extends Controller {
+
+       private final DatasetAndUserRepository datasetAndUserRepository;
+       private final ServiceAndUserRepository serviceAndUserRepository;
+       private final ServiceAndDatasetRepository serviceAndDatasetRepository;
+       private final UserRepository userRepository;
+       private final DatasetRepository datasetRepository;
+       private final ClimateServiceRepository serviceRepository;
+
+       @Inject
+       public GraphAlgorithmController(
+                       DatasetAndUserRepository datasetAndUserRepository,
+                       ServiceAndUserRepository serviceAndUserRepository,
+                       ServiceAndDatasetRepository serviceAndDatasetRepository,
+                       UserRepository userRepository, DatasetRepository 
datasetRepository,
+                       ClimateServiceRepository serviceRepository) {
+               this.datasetAndUserRepository = datasetAndUserRepository;
+               this.serviceAndUserRepository = serviceAndUserRepository;
+               this.serviceAndDatasetRepository = serviceAndDatasetRepository;
+               this.userRepository = userRepository;
+               this.datasetRepository = datasetRepository;
+               this.serviceRepository = serviceRepository;
+       }
+       
+       public Result getShortestPath(int source, int target, String format) {
+               
+               try {
+                       Iterable<DatasetAndUser> userDatasets = 
datasetAndUserRepository
+                                       .findAll();
+
+                       if (userDatasets == null) {
+                               System.out.println("User and Dataset: cannot be 
found!");
+                               return notFound("User and Dataset: cannot be 
found!");
+                       }
+                       List<Map<String, Object>> nodes = new 
ArrayList<Map<String, Object>>();
+                       List<Map<String, Object>> rels = new 
ArrayList<Map<String, Object>>();
+                       WeightedGraph<Integer, DefaultWeightedEdge> graph = 
createGraph(userDatasets, nodes, rels);
+                       Map<String, Object> map = new HashMap<>();
+                       
+                       List<Map<String, Object>> node = new 
ArrayList<Map<String, Object>>();
+                       List<Map<String, Object>> rel = new 
ArrayList<Map<String, Object>>();
+                       
+                       List<DefaultWeightedEdge> path =
+                       DijkstraShortestPath.findPathBetween(graph, source, 
target);
+                       for(DefaultWeightedEdge p : path) {
+                               int v1 = graph.getEdgeSource(p);
+                               int v2 = graph.getEdgeTarget(p);
+                               if(!node.contains(nodes.get(v1-1)))
+                                       node.add(nodes.get(v1-1));
+                               if(!node.contains(nodes.get(v2-1)))
+                                       node.add(nodes.get(v2-1));
+                               for(Map<String, Object> one : rels) {
+                                       if((int)one.get("from") == v1 && 
(int)one.get("to") == v2) {
+                                               rel.add(one);
+                                       }
+                               }
+                       }
+                       
+                       map = HashMapUtil.map("nodes", node, "edges", rel);
+                       
+                       String result = new String();
+                       if (format.equals("json")) {
+                               result = new Gson().toJson(map);
+                       }
+
+                       return ok(result);
+               } catch (Exception e) {
+                       return badRequest(e.getMessage());
+               }
+       }
+       
+public Result getKShortestPath(int source, int target, int k, String format) {
+               
+               try {
+                       Iterable<DatasetAndUser> userDatasets = 
datasetAndUserRepository
+                                       .findAll();
+
+                       if (userDatasets == null) {
+                               System.out.println("User and Dataset: cannot be 
found!");
+                               return notFound("User and Dataset: cannot be 
found!");
+                       }
+                       List<Map<String, Object>> nodes = new 
ArrayList<Map<String, Object>>();
+                       List<Map<String, Object>> rels = new 
ArrayList<Map<String, Object>>();
+                       WeightedGraph<Integer, DefaultWeightedEdge> graph = 
createGraph(userDatasets, nodes, rels);
+                       // return this map list
+                       List<Map<String, Object>> mapList = new 
ArrayList<Map<String, Object>>();
+
+                       KShortestPaths kPaths = new KShortestPaths(graph, 
source, k);
+                       List<GraphPath> paths = kPaths.getPaths(target);
+               
+                       for(GraphPath p : paths) {
+                               List<Map<String, Object>> node = new 
ArrayList<Map<String, Object>>();
+                               List<Map<String, Object>> rel = new 
ArrayList<Map<String, Object>>();
+                               for (Object edge : p.getEdgeList()) {
+                                       int v1 = 
graph.getEdgeSource((DefaultWeightedEdge)edge);
+                                       int v2 = 
graph.getEdgeTarget((DefaultWeightedEdge)edge);
+                                       if(!node.contains(nodes.get(v1-1)))
+                                               node.add(nodes.get(v1-1));
+                                       if(!node.contains(nodes.get(v2-1)))
+                                               node.add(nodes.get(v2-1));
+                                       for (Map<String, Object> one : rels) {
+                                               if((int)one.get("from") == v1 
&& (int)one.get("to") == v2) {
+                                                       rel.add(one);
+                                               }
+                                       }
+                               }
+                               mapList.add(HashMapUtil.map("nodes", node, 
"edges", rel));
+                       }
+               
+                       String result = new String();
+                       if (format.equals("json")) {
+                               result = new Gson().toJson(mapList);
+                       }
+
+                       return ok(result);
+               } catch (Exception e) {
+                       return badRequest(e.getMessage());
+               }
+       }
+       
+       public WeightedGraph<Integer, DefaultWeightedEdge> 
createGraph(Iterable<DatasetAndUser> userDatasets,
+                       List<Map<String, Object>> nodes, List<Map<String, 
Object>> rels) {
+               WeightedGraph<Integer, DefaultWeightedEdge> g =
+                   new SimpleWeightedGraph<Integer, 
DefaultWeightedEdge>(DefaultWeightedEdge.class);
+
+               int i = 1;
+               long edgeId = 1;
+               for (DatasetAndUser userDataset : userDatasets) {
+                       int source = 0;
+                       int target = 0;
+                       // Check whether the current user has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("user")
+                                               && (long) 
nodes.get(j).get("userId") == userDataset
+                                                               
.getUser().getId()) {
+                                       source = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (source == 0) {
+                               String realName = 
userDataset.getUser().getFirstName() + " "
+                                               + 
userDataset.getUser().getLastName();
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
realName, "label", userDataset
+                                               .getUser().getUserName(), 
"cluster", "1", "value", 1,
+                                               "group", "user", "userId", 
userDataset.getUser()
+                                                               .getId()));
+
+                               source = i;
+                               g.addVertex(source);
+                               i++;
+                       }
+                       // Check whether the current dataset has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("group").equals("dataset")
+                                               && (long) 
nodes.get(j).get("datasetId") == userDataset
+                                                               
.getDataset().getId()) {
+                                       target = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (target == 0) {
+                               nodes.add(HashMapUtil.map7("id", i, "title", 
userDataset.getDataset()
+                                               .getName(), "label",
+                                               
userDataset.getDataset().getName(), "cluster", "2",
+                                               "value", 2, "group", "dataset", 
"datasetId",
+                                               
userDataset.getDataset().getId()));
+                               target = i;
+                               g.addVertex(target);
+                               i++;
+                       }
+                       rels.add(HashMapUtil.map5("from", source, "to", target, 
"title", "USE",
+                                       "id", edgeId, "weight", 
userDataset.getCount()));
+                       g.addEdge(source, target);
+                       g.setEdgeWeight(g.getEdge(source, target), 
userDataset.getCount());
+                       edgeId++;
+               }
+               return g;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
index 9d5dad2..170ec78 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
@@ -480,13 +480,14 @@ public class ServiceExecutionLogController extends 
Controller {
                                        Dataset dataset = 
datasetRepository.findByDataSourceAndCMIP5VarName(source, variable).get(0);
                                        DatasetLog datasetLog = new 
DatasetLog(savedServiceExecutionLog,
                                                        dataset, user, plotUrl, 
dataUrl, dataset,
-                                                       dataset, 
datasetStudyStartTime, datasetStudyEndTime);
+                                                       dataset, 
executionStartTime, executionEndTime,
+                                                       datasetStudyStartTime, 
datasetStudyEndTime);
                                        DatasetLog savedDatasetLog = 
datasetLogRepository.save(datasetLog);
                                        System.out.print("DatasetLog saved:" + 
savedDatasetLog.getId());
                                        
                                        List<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository.findByUserAndDataset(user, dataset);
                                        if(datasetAndUsers.size() == 0) {
-                                               DatasetAndUser datasetAndUser = 
new DatasetAndUser(user, dataset, 0);
+                                               DatasetAndUser datasetAndUser = 
new DatasetAndUser(user, dataset, 1);
                                                
datasetAndUserRepository.save(datasetAndUser);
                                        }
                                        else {

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
index f6d8e27..d011cc0 100644
--- a/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
@@ -2,6 +2,7 @@ package models;
 
 import java.util.List;
 
+import org.springframework.data.domain.Sort;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.inject.Named;
@@ -14,4 +15,5 @@ public interface DatasetAndUserRepository extends 
CrudRepository<DatasetAndUser,
        List<DatasetAndUser> findByUserAndDataset(User user, Dataset dataset);
        List<DatasetAndUser> findByUser(User user);
        List<DatasetAndUser> findByDataset(Dataset dataset);
+       List<DatasetAndUser> findAll(Sort sort);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/models/DatasetLog.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetLog.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetLog.java
index b3a1069..ac92a53 100644
--- a/ApacheCMDA_Backend_1.0/app/models/DatasetLog.java
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetLog.java
@@ -8,9 +8,12 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 
 @Entity
 public class DatasetLog {
+       
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
@@ -32,6 +35,11 @@ public class DatasetLog {
        @JoinColumn(name = "outputDatasetId", referencedColumnName = "id")
        private Dataset outputDataset;
        
+       @Temporal(TemporalType.TIMESTAMP)
+       private Date serviceExecutionStartTime;
+       @Temporal(TemporalType.TIMESTAMP)
+       private Date serviceExecutionEndTime;
+       
        private Date datasetStudyStartTime;
        private Date datasetStudyEndTime;
        
@@ -39,9 +47,11 @@ public class DatasetLog {
                
        }
        
-       public DatasetLog(ServiceExecutionLog serviceExecutionLog, Dataset 
dataset,
-                       User user, String plotUrl, String dataUrl, Dataset 
originalDataset,
-                       Dataset outputDataset, Date datasetStudyStartTime, Date 
datasetStudyEndTime) {
+       public DatasetLog(ServiceExecutionLog serviceExecutionLog,
+                       Dataset dataset, User user, String plotUrl, String 
dataUrl,
+                       Dataset originalDataset, Dataset outputDataset,
+                       Date serviceExecutionStartTime, Date 
serviceExecutionEndTime,
+                       Date datasetStudyStartTime, Date datasetStudyEndTime) {
                super();
                this.serviceExecutionLog = serviceExecutionLog;
                this.dataset = dataset;
@@ -50,6 +60,8 @@ public class DatasetLog {
                this.dataUrl = dataUrl;
                this.originalDataset = originalDataset;
                this.outputDataset = outputDataset;
+               this.serviceExecutionStartTime = serviceExecutionStartTime;
+               this.serviceExecutionEndTime = serviceExecutionEndTime;
                this.datasetStudyStartTime = datasetStudyStartTime;
                this.datasetStudyEndTime = datasetStudyEndTime;
        }
@@ -118,6 +130,22 @@ public class DatasetLog {
                this.user = user;
        }
        
+       public Date getServiceExecutionStartTime() {
+               return serviceExecutionStartTime;
+       }
+
+       public void setServiceExecutionStartTime(Date 
serviceExecutionStartTime) {
+               this.serviceExecutionStartTime = serviceExecutionStartTime;
+       }
+
+       public Date getServiceExecutionEndTime() {
+               return serviceExecutionEndTime;
+       }
+
+       public void setServiceExecutionEndTime(Date serviceExecutionEndTime) {
+               this.serviceExecutionEndTime = serviceExecutionEndTime;
+       }
+       
        public Date getDatasetStudyStartTime() {
                return datasetStudyStartTime;
        }
@@ -137,13 +165,14 @@ public class DatasetLog {
        @Override
        public String toString() {
                return "DatasetLog [id=" + id + ", serviceExecutionLog="
-                               + serviceExecutionLog + ", dataSet=" + dataset 
+ ", user="
+                               + serviceExecutionLog + ", dataset=" + dataset 
+ ", user="
                                + user + ", plotUrl=" + plotUrl + ", dataUrl=" 
+ dataUrl
-                               + ", originalDataSet=" + originalDataset + ", 
outputDataSet="
-                               + outputDataset + ", datasetStudyStartTime="
+                               + ", originalDataset=" + originalDataset + ", 
outputDataset="
+                               + outputDataset + ", serviceExecutionStartTime="
+                               + serviceExecutionStartTime + ", 
serviceExecutionEndTime="
+                               + serviceExecutionEndTime + ", 
datasetStudyStartTime="
                                + datasetStudyStartTime + ", 
datasetStudyEndTime="
                                + datasetStudyEndTime + "]";
        }
        
-       
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
index de4ce6c..83068f8 100644
--- a/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
@@ -1,5 +1,8 @@
 package models;
 
+import java.util.Date;
+import java.util.List;
+
 import org.springframework.data.repository.CrudRepository;
 
 import javax.inject.Named;
@@ -9,4 +12,6 @@ import javax.inject.Singleton;
 @Singleton
 public interface DatasetLogRepository extends CrudRepository<DatasetLog, Long> 
{
        
+    List<DatasetLog> 
findByServiceExecutionStartTimeGreaterThanEqualAndServiceExecutionEndTimeLessThanEqualAndUser_Id(Date
 serviceExecutionStartTime, Date serviceExecutionEndTime, long userId);
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/models/ServiceAndDatasetRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/ServiceAndDatasetRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/ServiceAndDatasetRepository.java
index 14258b3..a9c67b1 100644
--- a/ApacheCMDA_Backend_1.0/app/models/ServiceAndDatasetRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/ServiceAndDatasetRepository.java
@@ -2,6 +2,7 @@ package models;
 
 import java.util.List;
 
+import org.springframework.data.domain.Sort;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.inject.Named;
@@ -13,6 +14,6 @@ public interface ServiceAndDatasetRepository extends 
CrudRepository<ServiceAndDa
 
        List<ServiceAndDataset> findByClimateService(ClimateService service);
        List<ServiceAndDataset> findByDataset(Dataset dataset);
-               
+       List<ServiceAndDataset> findAll(Sort sort);
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/models/ServiceAndUserRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/ServiceAndUserRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/ServiceAndUserRepository.java
index 4f1c960..deb319c 100644
--- a/ApacheCMDA_Backend_1.0/app/models/ServiceAndUserRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/ServiceAndUserRepository.java
@@ -2,6 +2,7 @@ package models;
 
 import java.util.List;
 
+import org.springframework.data.domain.Sort;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.inject.Named;
@@ -13,6 +14,6 @@ public interface ServiceAndUserRepository extends 
CrudRepository<ServiceAndUser,
 
        List<ServiceAndUser> findByUser(User user);
        List<ServiceAndUser> findByClimateService(ClimateService service);
-               
+       List<ServiceAndUser> findAll(Sort sort);
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/app/util/HashMapUtil.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/util/HashMapUtil.java 
b/ApacheCMDA_Backend_1.0/app/util/HashMapUtil.java
new file mode 100644
index 0000000..3f03084
--- /dev/null
+++ b/ApacheCMDA_Backend_1.0/app/util/HashMapUtil.java
@@ -0,0 +1,55 @@
+package util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HashMapUtil {
+       
+       public static Map<String, Object> map(String key1, Object value1, 
String key2,
+                       Object value2) {
+               Map<String, Object> result = new HashMap<String, Object>(2);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               return result;
+       }
+       
+       public static Map<String, Object> map5(String key1, Object value1, 
String key2,
+                       Object value2, String key3, Object value3, String key4, 
Object value4,
+                       String key5, Object value5) {
+               Map<String, Object> result = new HashMap<String, Object>(5);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               result.put(key3, value3);
+               result.put(key4, value4);
+               result.put(key5, value5);
+               return result;
+       }
+       
+       public static Map<String, Object> map6(String key1, Object value1, 
String key2,
+                       Object value2, String key3, Object value3, String key4, 
Object value4,
+                       String key5, Object value5, String key6, Object value6) 
{
+               Map<String, Object> result = new HashMap<String, Object>(6);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               result.put(key3, value3);
+               result.put(key4, value4);
+               result.put(key5, value5);
+               result.put(key6, value6);
+               return result;
+       }
+
+       public static Map<String, Object> map7(String key1, Object value1, 
String key2,
+                       Object value2, String key3, Object value3, String key4,
+                       Object value4, String key5, Object value5, String key6,
+                       Object value6, String key7, Object value7) {
+               Map<String, Object> result = new HashMap<String, Object>(7);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               result.put(key3, value3);
+               result.put(key4, value4);
+               result.put(key5, value5);
+               result.put(key6, value6);
+               result.put(key7, value7);
+               return result;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/build.sbt
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/build.sbt b/ApacheCMDA_Backend_1.0/build.sbt
index e1d17a5..c5101a8 100644
--- a/ApacheCMDA_Backend_1.0/build.sbt
+++ b/ApacheCMDA_Backend_1.0/build.sbt
@@ -20,7 +20,7 @@ libraryDependencies ++= Seq(
   "org.mockito" % "mockito-core" % "1.10.19" % "test",
   "mysql" % "mysql-connector-java" % "5.1.34",
   "com.google.code.gson" % "gson" % "2.3.1",
-  "org.hibernate" % "hibernate-c3p0" % "4.3.7.Final"
+  "org.hibernate" % "hibernate-c3p0" % "4.3.7.Final",
+  "com.googlecode.efficient-java-matrix-library" % "ejml" % "0.23",
+  "org.jgrapht" % "jgrapht-jdk1.5" % "0.7.3"
 )
-
-

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/conf/.DS_Store
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/conf/.DS_Store 
b/ApacheCMDA_Backend_1.0/conf/.DS_Store
index c7bbec7..5008ddf 100644
Binary files a/ApacheCMDA_Backend_1.0/conf/.DS_Store and 
b/ApacheCMDA_Backend_1.0/conf/.DS_Store differ

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/conf/routes
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/conf/routes 
b/ApacheCMDA_Backend_1.0/conf/routes
index 3846661..46b5ef1 100644
--- a/ApacheCMDA_Backend_1.0/conf/routes
+++ b/ApacheCMDA_Backend_1.0/conf/routes
@@ -64,6 +64,8 @@ DELETE        
/serviceExecutionLog/deleteServiceExecutionLogs/:id
 GET           /datasetLog/getAllDatasetLogs/json                               
                         
@controllers.DatasetLogController.getAllDatasetLogs(format: String="json")
 GET           /datasetLog/getDatasetLog/id/:id/json                            
                         @controllers.DatasetLogController.getDatasetLog(id: 
Long, format: String="json")
 POST          /datasetLog/addDatasetLog                                        
                         @controllers.DatasetLogController.addDatasetLog
+POST             /datasetLog/queryDatasets                                     
                                                                                
                @controllers.DatasetLogController.queryDatasets
+POST             /datasetLog/queryVariables                                    
                                                                                
        @controllers.DatasetLogController.queryVariables
 PUT           /datasetLog/updateDatasetLog/id/:id                              
                         
@controllers.DatasetLogController.updateDatasetLogById(id: Long)
 DELETE        /datasetLog/deleteDatasetLog/id/:id                              
                         @controllers.DatasetLogController.deleteDatasetLog(id: 
Long)
 
@@ -139,16 +141,20 @@ POST                /users/isEmailExisted                 
                                                                                
                                        @controllers.UserController.isEma
 DELETE           /users/delete/userName/:userName/password/:password           
                                                                
@controllers.UserController.deleteUserByUserNameandPassword(userName: String, 
password: String)
 
 # Analytics
-#GET                     /analytics/getAllDatasetAndUserWithCount/json         
                                                                            
@controllers.AnalyticsController.getAllDatasetAndUserWithCount(format: 
String="json")
-#GET                     /analytics/getAllServiceAndUserWithCount/json         
                                                                            
@controllers.AnalyticsController.getAllServiceAndUserWithCount(format: 
String="json")
-#GET                     /analytics/getAllServiceAndDatasetWithCount/json      
                                                                                
@controllers.AnalyticsController.getAllServiceAndDatasetWithCount(format: 
String="json")
+#GET             /analytics/getAllDatasetAndUserWithCount/json                 
                                                                    
@controllers.AnalyticsController.getAllDatasetAndUserWithCount(format: 
String="json")
+#GET             /analytics/getAllServiceAndUserWithCount/json                 
                                                                    
@controllers.AnalyticsController.getAllServiceAndUserWithCount(format: 
String="json")
+#GET             /analytics/getAllServiceAndDatasetWithCount/json              
                                                                        
@controllers.AnalyticsController.getAllServiceAndDatasetWithCount(format: 
String="json")
 GET                      
/analytics/getOneUserWithAllDatasetAndCountByUserId/:id/json                    
                                      
@controllers.AnalyticsController.getOneUserWithAllDatasetAndCount(id: Long, 
format: String="json")
-GET                      
/analytics/getOneDatasetWithAllDatasetAndCountByDatasetId/:id/json              
                              
@controllers.AnalyticsController.getOneDatasetWithAllDatasetAndCount(id: Long, 
format: String="json")
+GET                      
/analytics/getOneDatasetWithAllUserAndCountByDatasetId/:id/json                 
                                      
@controllers.AnalyticsController.getOneDatasetWithAllUserAndCount(id: Long, 
format: String="json")
 GET                      
/analytics/getOneUserWithAllServiceAndCountByUserId/:id/json                    
                                      
@controllers.AnalyticsController.getOneUserWithAllServiceAndCount(id: Long, 
format: String="json")
 GET                      
/analytics/getOneServiceWithAllUserAndCountByServiceId/:id/json                 
                                      
@controllers.AnalyticsController.getOneServiceWithAllUserAndCount(id: Long, 
format: String="json")
 GET                      
/analytics/getOneServiceWithAllDatasetAndCountByServiceId/:id/json              
                              
@controllers.AnalyticsController.getOneServiceWithAllDatasetAndCount(id: Long, 
format: String="json")
 GET                      
/analytics/getOneDatasetWithAllServiceAndCountByDatasetId/:id/json              
                              
@controllers.AnalyticsController.getOneDatasetWithAllServiceAndCount(id: Long, 
format: String="json")
 POST             /analytics/getRelationalKnowledgeGraph/json                   
                                                                        
@controllers.AnalyticsController.getRelationalKnowledgeGraph(format: 
String="json")
 
+# Graph Algorithm
+GET                      
/graphAlgorithm/getShortestPath/source/:source/target/:target/json              
                              
@controllers.GraphAlgorithmController.getShortestPath(source: Integer, target: 
Integer, format: String="json")
+GET                      
/graphAlgorithm/getKthShortestPath/source/:source/target/:target/k/:k/json      
                      
@controllers.GraphAlgorithmController.getKShortestPath(source: Integer, target: 
Integer, k:Integer, format: String="json")
+
 # Map static resources from the /public folder to the /assets URL path
 GET           /assets/*file                                                    
                         controllers.Assets.at(path="/public", file)

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/test/DatasetLogTest.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/test/DatasetLogTest.java 
b/ApacheCMDA_Backend_1.0/test/DatasetLogTest.java
index eb5f371..21e4960 100644
--- a/ApacheCMDA_Backend_1.0/test/DatasetLogTest.java
+++ b/ApacheCMDA_Backend_1.0/test/DatasetLogTest.java
@@ -20,6 +20,8 @@ public class DatasetLogTest {
        private static Dataset TEST_ORIGINAL_DATASET;
        private static Dataset TEST_OUTPUT_DATASET;
        private static User TEST_USER;
+       private static Date TEST_SERVICE_EXECUTION_START_TIME;
+       private static Date TEST_SERVICE_EXECUTION_END_TIME;
        private static Date TEST_DATASET_STUDY_START_TIME;
        private static Date TEST_DATASET_STUDY_END_TIME;
        
@@ -34,10 +36,13 @@ public class DatasetLogTest {
                TEST_OUTPUT_DATASET = new Dataset();
                datasetLog = new DatasetLog();
                TEST_USER = new User();
+               TEST_SERVICE_EXECUTION_START_TIME = new Date();
+               TEST_SERVICE_EXECUTION_END_TIME = new Date();
                TEST_DATASET_STUDY_START_TIME = new Date();
                TEST_DATASET_STUDY_END_TIME = new Date();
                datasetLog1 = new DatasetLog(serviceExecutionLog, TEST_DATASET, 
TEST_USER, TEST_PLOT_URL, TEST_DATA_URL,
-                               TEST_ORIGINAL_DATASET, TEST_OUTPUT_DATASET, 
TEST_DATASET_STUDY_START_TIME, TEST_DATASET_STUDY_END_TIME);
+                               TEST_ORIGINAL_DATASET, TEST_OUTPUT_DATASET, 
TEST_SERVICE_EXECUTION_START_TIME, TEST_SERVICE_EXECUTION_END_TIME,
+                               TEST_DATASET_STUDY_START_TIME, 
TEST_DATASET_STUDY_END_TIME);
        }
        
        @Test

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/edcdd408/ApacheCMDA_Backend_1.0/test/ServiceExecutionLogTest.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/test/ServiceExecutionLogTest.java 
b/ApacheCMDA_Backend_1.0/test/ServiceExecutionLogTest.java
index f237e96..8642767 100644
--- a/ApacheCMDA_Backend_1.0/test/ServiceExecutionLogTest.java
+++ b/ApacheCMDA_Backend_1.0/test/ServiceExecutionLogTest.java
@@ -25,6 +25,7 @@ public class ServiceExecutionLogTest {
        private static String TEST_DATA_URL = "test_dataUrl";
        private static Date TEST_DATASET_STUDY_START_TIME;
        private static Date TEST_DATASET_STUDY_END_TIME;
+       private static String TEST_URL = "test_url";
        
        private static ServiceExecutionLog serviceExecutionLog;
        private static ServiceExecutionLog serviceExecutionLog1;
@@ -41,7 +42,7 @@ public class ServiceExecutionLogTest {
                TEST_DATASET_STUDY_END_TIME = new Date();
                serviceExecutionLog1 = new ServiceExecutionLog(climateService, 
user, serviceConfiguration, TEST_PURPOSE,
                                TEST_EXECUTION_START_TIME, 
TEST_EXECUTION_END_TIME, TEST_DATA_URL, TEST_PLOT_URL,
-                               TEST_DATASET_STUDY_START_TIME, 
TEST_DATASET_STUDY_END_TIME);
+                               TEST_DATASET_STUDY_START_TIME, 
TEST_DATASET_STUDY_END_TIME, TEST_URL);
        }
        
        @Test
@@ -99,6 +100,12 @@ public class ServiceExecutionLogTest {
        }
        
        @Test
+       public void testUrl(){
+               serviceExecutionLog.setUrl(TEST_URL);
+               assertEquals(TEST_URL, serviceExecutionLog.getUrl());
+       }
+       
+       @Test
        public void testDatasetStudyStartTime() {
                
serviceExecutionLog.setDatasetStudyStartTime(TEST_DATASET_STUDY_START_TIME);
                assertEquals(TEST_DATASET_STUDY_START_TIME, 
serviceExecutionLog.getDatasetStudyStartTime());

Reply via email to