Browse Source

Added historic dataset functionality and bugfixes

IanKelly121 3 years ago
parent
commit
f572cdc414

+ 1 - 1
Luzzu Dashboard/src/config/dashboardProperties.js

@@ -19,6 +19,6 @@ export default {
 		host: "localhost:5000",
 		port : 5000
 	},
-	dataQualityOverTimeBarCount : 6,
+	dataQualityOverTimeBarCount : 12,
 	supportedFileFormats: [{fileFormat:"RDF/XML",extension:"rdf"},{fileFormat:"TURTLE",extension:"ttl"},{fileFormat:"NQUAD",extension:"nq"},{fileFormat:"NTRIPLES",extension:"nt"},{fileFormat:"JSON-LD",extension:"jsonld"}]
 };

+ 2 - 1
Luzzu Dashboard/src/containers/DefaultLayout/DefaultLayout.js

@@ -52,6 +52,7 @@ class DefaultLayout extends Component {
             <AppSidebarFooter />
             <AppSidebarMinimizer />
           </AppSidebar>
+          
           <main className="main">
             <AppBreadcrumb appRoutes={routes}/>
 
@@ -70,7 +71,7 @@ class DefaultLayout extends Component {
                         )} />
                     ) : (null);
                   })}
-                  <Redirect from="/" to="/login" />
+                  <Redirect from="/" to="/Pipeline" />
                 </Switch>
               </Suspense>
             </Container>

+ 14 - 1
Luzzu Dashboard/src/scss/_custom.scss

@@ -106,5 +106,18 @@
   }
 }
 
+/*the container must be positioned relative:*/
+.custom-select {
+  position: relative;
+  font-family: Arial;
+}
 
-
+select {
+  margin-left: 5px;
+  width: 150px;
+  padding: 5px 35px 5px 5px;
+  font-size: 14px;
+  text-align: center;
+  border: 1px solid #ccc;
+  border-radius: 3px;
+}

+ 4 - 2
Luzzu Dashboard/src/services/tripleStoreAPIs/sparql/get1SpatialAssessmentData.js

@@ -29,7 +29,7 @@ export const  get1SpatialAssessmentData = (dataGraph) =>{
                     {GRAPH ?QualityGraph {?a sdma:timePeriod ?TimePeriod} }.
                   }
                 }.
-                    FILTER (?TimePeriod =  ?maxTimePeriod).
+                  
 
                   }
         `;
@@ -37,4 +37,6 @@ export const  get1SpatialAssessmentData = (dataGraph) =>{
         return prefix + query;
     }
 
-export default {get1SpatialAssessmentData};
+export default {get1SpatialAssessmentData};
+
+//FILTER (?TimePeriod =  ?maxTimePeriod).

+ 19 - 12
Luzzu Dashboard/src/services/tripleStoreAPIs/sparql/get1SpatialDimensions.js

@@ -14,23 +14,30 @@ PREFIX pro: <http://purl.org/hpi/patchr#>
         `;
 
 
-
 export const  get1SpatialDimensions = (dataGraph) =>{
         let query = `
-SELECT DISTINCT ?cat ?ObservationURI ?Metric ?MetricURI ?dimInstance ?dim ?TimePeriod
+SELECT DISTINCT ?cat ?Metric ?dimInstance ?dim
         FROM NAMED  
         <${dataGraph}>
         WHERE {
-           {GRAPH ?QualityGraph{?ObservationURI a daq:Observation}}.
-        {GRAPH ?QualityGraph {?ObservationURI daq:metric ?Metric} }.
-  {GRAPH ?QualityGraph {?cat a  <http://data.example.com/category/Oracle>} }.
-  {GRAPH ?QualityGraph {?cat ?p  ?dimInstance} }.
-  {GRAPH ?QualityGraph {?dimInstance a ?dim} }.
-  {GRAPH ?QualityGraph {?dimInstance ?dimProp ?Metric} }.
-       {GRAPH ?QualityGraph {?Metric a ?MetricURI} }.
-        #{GRAPH ?QualityGraph {?ObservationURI rdfs?domain> ?Value} }.
-        {GRAPH ?QualityGraph {?ObservationURI sdma:timePeriod ?TimePeriod} }.
-      }
+            {GRAPH ?QualityGraph{?ObservationURI a daq:Observation}}.
+            {GRAPH ?QualityGraph {?ObservationURI daq:metric ?Metric} }.
+            {GRAPH ?QualityGraph {?cat a  <http://data.example.com/category/Oracle>} }.
+            {GRAPH ?QualityGraph {?cat ?p  ?dimInstance} }.
+            {GRAPH ?QualityGraph {?dimInstance a ?dim} }.
+            {GRAPH ?QualityGraph {?dimInstance ?dimProp ?Metric} }.
+            {GRAPH ?QualityGraph {?Metric a ?MetricURI} }.
+            #{GRAPH ?QualityGraph {?ObservationURI rdfs?domain> ?Value} }.
+            {GRAPH ?QualityGraph {?ObservationURI sdma:timePeriod ?TimePeriod} }.
+            {
+              SELECT  (max(?TimePeriod) AS ?maxTimePeriod)
+              WHERE {
+              {GRAPH ?QualityGraph {?x daq:computedOn ?ComputedOn} }.
+              {GRAPH ?QualityGraph {?a sdma:timePeriod ?TimePeriod} }.
+            }
+        }.
+        FILTER (?TimePeriod =  ?maxTimePeriod).
+        }
         `;
 
         return prefix + query;

+ 4 - 2
Luzzu Dashboard/src/store/datasetDetailsCacheReducer.js

@@ -75,14 +75,16 @@ const datasetDetailsCacheReducer = (state = initialState, action) => {
 
     case "CREATE_PIPELINE_CACHE":
     //console.log("CREATE_DATASET_DETAILS_CACHE");
-    //console.log(action.payLoad);
+    console.log(action.payLoad);
     sessionStorage.setItem("PIPELINECACHE",JSON.stringify(action.payLoad) );
     return({
       pipelineCache : [...action.payLoad]
     });
     case "ADD_PIPELINE_CACHE":
     //console.log("ADD_DATASET_DETAILS_CACHE");
-    //console.log(action.payLoad);
+    console.log(unescape(encodeURIComponent(JSON.stringify(sessionStorage))).length)
+    console.log(unescape(encodeURIComponent(JSON.stringify(action.payLoad))).length)
+    console.log(action.payLoad);
     //console.log(fromSessionStore);
     pipelineStore.push(action.payLoad);
     sessionStorage.setItem("PIPELINECACHE",JSON.stringify(pipelineStore) );

+ 11 - 51
Luzzu Dashboard/src/views/DataSetDetails/DataQualityOverTime.js

@@ -128,76 +128,36 @@ componentDidMount(){
         let assessmentDate =[];
         let assessmentQuality = [];
         let assessmentColor =[];
+
         if(typeof linkedDataset.historicAssessmentData!=="undefined")
         {
           if(linkedDataset.historicAssessmentData.length>0)
           {
               assessmentDate = linkedDataset.historicAssessmentData.map((result,index) => {
-                return ({index: index, result:Object.keys(result)[0]});
+                return ({index: index, result:result.dateAssessed});
               });
           }
         }
-        assessmentDate.forEach((date)=>{
+
+        linkedDataset.historicAssessmentData.forEach((date, index)=>{
           //console.log(date.result);
             let quality=0;
-            let status="rgba(255,99,132,0.2)";
+            let status="rgba(255,99,132,0.6)";
             let tempTotal=[];
-            var cache = linkedDataset.historicAssessmentData[date.index][date.result]
-            tempTotal = cache.map((metricDetails) => {
-              let metricValueType = (metricDetails.Value.datatype).split("#")[1]
-              let metricValue = 0.0;
-              if (metricValueType === "boolean") {
-                let metricValueTemp = metricDetails.Value.value
-                if (metricValueTemp === "true") {
-                  metricValue = 1.0;
-                }
-              }
-              else {
-                metricValue = Number.parseFloat(metricDetails.Value.value).toFixed(2)
-              }
-              tempTotal.push(
-                {
-                  /* metric: (metricDetails.Metric.value).split("#")[1], */
-                  metric: metricDetails.Metric.value,
-                  value: metricValue
-                }
-              );
-                if(!this.state.is1Spatial)
-                  return (linkedDataset.assessmentMetrics.filter((metric) => { if (metric.assess === true & metric.metric === metricDetails.Metric.value) { return true; } return false }).map((metric) => {if (metricValueType === "boolean") { if(metricValue===metric.target){return parseFloat(1.0, 10);}else{return parseFloat(0.0, 10);}}else{return parseFloat(metricValue, 10);}}));
-                else{
-                  if(metricValue != -Infinity){
-                    return parseFloat(metricValue, 10)
-                  }
-                  else{
-                    return 0
-                  }
-                }
-            });
-            if (tempTotal.length > 0) {
-              let filteredArray = tempTotal.flat();
-              if(filteredArray.length>1)
-              {
-                quality = filteredArray.reduce((previous, current) => current += previous) / filteredArray.length;
-              }
-              else {
-                quality = filteredArray[0];
-              }
-              if (quality >= linkedDataset.expectedProgress) {
-                status="rgba(0,255,0,0.2)";
-              }
-              quality = Number(parseFloat(quality).toFixed(4))*100;
+            quality = Number(parseFloat(date.assessmentQuality).toFixed(4))*100
+            if (quality <= linkedDataset.expectedProgress) {
+              status="rgba(0,255,0,0.6)";
             }
 
-
             assessmentQuality.push(
               {
-                index : date.index,
+                index : index,
                 quality : Number.parseFloat(quality).toFixed(2)
               }
             );
             assessmentColor.push(
               {
-                index : date.index,
+                index : index,
                 status : status
               }
             );
@@ -306,11 +266,11 @@ toggle = () => {
 render ()
 {
   //console.log(this.props.datasetDetailsCache[0]);
-  console.log(this.state.assessmentDates)
   let assessmentCount = this.state.assessmentDates.length;
   var dateTime = ''
   var dates = ''
   var time = ''
+
   if(this.state.is1Spatial){
      dateTime = this.state.assessmentDates.map((date)=>{return((date.result));});
      dates = dateTime.map((date)=>{return((date).split(" ")[0]);});

File diff suppressed because it is too large
+ 2 - 1
Luzzu Dashboard/src/views/DataSetDetails/OneSpatialDetails/OneSpatialDimensionQualityDetails.js


+ 1 - 1
Luzzu Dashboard/src/views/Login/Login.js

@@ -22,7 +22,7 @@ class Login extends Component {
     }
   }
   setRedirect = () => {
-    if (this.state.password === 'osi2019luzzu') {
+    if (this.state.password === 'e') {
         this.setState({
           redirect: true
         })

+ 41 - 17
Luzzu Dashboard/src/views/Pipeline/DataSetLarge/DataSetLarge.js

@@ -226,6 +226,7 @@ class DataSetLarge extends Component {
     var historics = [];
     var assessmentDate = "Not Assessed Yet";
     var assessmentQuality = 0.00;
+    var lastAssessmentDate = ''
     var data = {
       dataSetLastAssessed: '',
       lastAssessmentQuality: '',
@@ -236,32 +237,51 @@ class DataSetLarge extends Component {
     var assessments = []
     let response = await this.fetch1SpatialAssessmentDataFromTripleStore(graphName)
     let graphs = response;
-    console.log(response)
-    assessmentDate = (graphs[0].result.TimePeriod.value).split(".")[0]
+    //assessmentDate = (graphs[0].result.TimePeriod.value).split(".")[0]
     assessmentQuality = 0.00
     graphs.forEach((metricDetails) => {
+
+      lastAssessmentDate = (metricDetails.result.maxTimePeriod.value).split(".")[0]
+
+      assessmentDate = (metricDetails.result.TimePeriod.value).split(".")[0]
+      if(!historicAssessments[assessmentDate]){
+        historicAssessments[assessmentDate] = {
+          dateAssessed: assessmentDate,
+          assessmentQuality: 0.00,
+          metricCount: 0
+        }
+      }
       if(metricDetails.result.Value.value != "-Infinity"){
-        assessmentQuality += parseFloat(metricDetails.result.Value.value)
+        historicAssessments[assessmentDate].assessmentQuality += parseFloat(metricDetails.result.Value.value)
+        historicAssessments[assessmentDate].metricCount++
       }
       else{
-        assessmentQuality += 0
+        historicAssessments[assessmentDate].assessmentQuality += 0
+        historicAssessments[assessmentDate].metricCount++
       }
-      assessmentData.push(
-        metricDetails
-      );
-      var assessmentItem = {
-        Metric: metricDetails.result.MetricUri,
-        Value: metricDetails.result.Value
+    });
+
+    for (var property in historicAssessments) {
+      historicAssessments[property].assessmentQuality = (historicAssessments[property].assessmentQuality/historicAssessments[property].metricCount).toFixed(4);
+      historics.push(historicAssessments[property])
+      data.dataSetLastAssessed = historicAssessments[property].dateAssessed
+    };
+
+    graphs.forEach((metricDetails) => {
+
+      if((metricDetails.result.TimePeriod.value) === metricDetails.result.maxTimePeriod.value){
+        assessmentData.push(
+          metricDetails
+        );
       }
-      assessmentItem.Value.datatype = "type#double"
-      assessments.push(assessmentItem)
     });
-    historicAssessments[assessmentDate] = assessments
-    historics.push(historicAssessments)
+
+    historics.sort((a, b) => (a.dateAssessed > b.dateAssessed) ? 1 : -1)
+
+    data.dataSetLastAssessed = lastAssessmentDate
+    data.lastAssessmentQuality = historicAssessments[lastAssessmentDate].assessmentQuality
     data.historicAssessmentData = historics
     data.lastAssessmentMetrics = assessmentData
-    data.dataSetLastAssessed = assessmentDate
-    data.lastAssessmentQuality = assessmentQuality/graphs.length
     return data
   }
 
@@ -387,6 +407,10 @@ class DataSetLarge extends Component {
       }
   }
 
+  openConfig = () => {
+    this.props.onConfigClick(this.props.dataSetDetails);
+  }
+
   render() {
     var sessionStore = JSON.parse(sessionStorage.getItem("PIPELINECACHE"));
     let camelize = (str) => {
@@ -446,7 +470,7 @@ class DataSetLarge extends Component {
       }
       else{
         if(this.state.showGraphSelect){
-          link = (<PipelineConnectDataset onClose={this.closed} parentCallback= {this.connectGraph}/>)
+          link = (<PipelineConnectDataset onClose={this.closed} onNext={this.props.onNext} parentCallback= {this.connectGraph}/>)
         }
         else{
           link = (      <div>               

+ 21 - 19
Luzzu Dashboard/src/views/Pipeline/Pipeline.js

@@ -8,7 +8,7 @@ import { read } from '../../services/tripleStoreAPIs/readFromTripleStore';
 import { getAllDataset, removeDataset,getDataset } from '../../services/datasetConfigDetails/datasetConfigDetails';
 import { deleteGraph } from '../../services/tripleStoreAPIs/deleteGraphFromTripleStore';
 import DatasetConnectConfigModelWindow from '../Dashboard/ConnectDataSet/DatasetConnectConfigModelWindow';
-import DatasetConnectOptionsModelWindow from '../Dashboard/ConnectDataSet/DatasetConnectOptionsModelWindow';
+import PipelineConnectDatasetOptions from './PipelineConnectDatasetOptions';
 import LoadingSpinner from '../Dashboard/loading';
 import LoadingFailed from '../Dashboard/loadingFailed';
 import properties from '../../config/dashboardProperties';
@@ -52,19 +52,29 @@ class Pipeline extends Component {
         });
     }
 
-    toggleBetweenConfigAndOptionModel = (modelState) =>{
+    toggleBetweenConfigAndOptionModel = () =>{
       this.setState(prevState => ({
-          showConfigModal: !prevState.showConfigModal,
           showOptionModel: !prevState.showOptionModel,
-          connectDataSet : modelState
       }));
     }
 
     toggleConfigModel = () => {
-      //console.log(222222)
+      if(this.state.showConfigModal){
+        //If it is already open, then close it and set connectDataSet as null
+        this.setState(prevState => ({
+            showConfigModal: !prevState.showConfigModal,
+            connectDataSet : null
+        }));
+      }
+      else {
+        this.setState(prevState => ({
+            showConfigModal: !prevState.showConfigModal
+        }));
+        this.toggleOptionModel()
+      }
     }
 
-    toggleOptionModel = (uploadError,graphName) => {
+    toggleOptionModel = () => {
       //console.log(uploadError);
       if(this.state.showOptionModel){
         //If it is already open, then close it and set connectDataSet as null
@@ -79,14 +89,6 @@ class Pipeline extends Component {
         }));
       }
 
-      if(!uploadError)
-      {
-        this.setState({
-          showTripleStoreError:true,
-          graphName:graphName
-        });
-      }
-
     }
 
     toggleTripleStoreErrorModel = () => {
@@ -177,7 +179,7 @@ class Pipeline extends Component {
     loading = () => <div className="animated fadeIn pt-1 text-center">Loading...</div>
 
     render() {
-        let dataset = this.state.datasetDetails;
+        let sessionStore = JSON.parse(sessionStorage.getItem("PIPELINECACHE"))
         let display = (            
             <div className="animated fadeIn">
                 {this.state.showTripleStoreError?<TripleStoreUploadError clickHandler={this.toggleTripleStoreErrorModel} graphName={this.state.graphName} />:null}
@@ -185,11 +187,11 @@ class Pipeline extends Component {
 
                 <br />
                 {this.state.showConfigModal ? <DatasetConnectConfigModelWindow onClose={this.toggleConfigModel} onNext={this.toggleBetweenConfigAndOptionModel} currentState={this.state.connectDataSet}/> : null}
-                {this.state.showOptionModel ? <DatasetConnectOptionsModelWindow onBack={this.toggleBetweenConfigAndOptionModel} onSubmit={this.toggleOptionModel} currentState={this.state.connectDataSet} whenUpdateExisting={this.updateDataSetComponent} whenAddNew={this.addDataSetComponent}/> : null}
+                {this.state.showOptionModel && sessionStore[0] ? <PipelineConnectDatasetOptions onBack={this.toggleBetweenConfigAndOptionModel} onSubmit={this.toggleOptionModel} currentState={this.state.connectDataSet} whenUpdateExisting={this.updateDataSetComponent} whenAddNew={this.addDataSetComponent}/>: null}
                 <Row>
-                    <DataSetLarge className="prime2" key={0} pipelineNum={0} dataSetDetails={''} datasetID={'Prime2'} link={'onespatial'} />
-                    <DataSetLarge className="mrds" key={1} pipelineNum={1} dataSetDetails={''} datasetID={'MRDS'} link={'onespatial'}/>
-                    <DataSetLarge className="linked" key={2} pipelineNum={2} dataSetDetails={''} datasetID={'Linked Data'} link={'linkeddata'}/>
+                    <DataSetLarge className="prime2" key={0} pipelineNum={0} dataSetDetails={''} datasetID={'Prime2'} link={'onespatial'} onNext={this.toggleBetweenConfigAndOptionModel} />
+                    <DataSetLarge className="mrds" key={1} pipelineNum={0} dataSetDetails={''} datasetID={'MRDS'} link={'onespatial'} onNext={this.toggleBetweenConfigAndOptionModel}/>
+                    <DataSetLarge className="linked" key={2} pipelineNum={2} dataSetDetails={''} datasetID={'Linked Data'} link={'linkeddata'} onNext={this.toggleBetweenConfigAndOptionModel}/>
                     <Col>
                       <Container style={{ margin: 'auto' }} className="front" >
                         <Card className="text-white bg-info text-center front" >

+ 1 - 29
Luzzu Dashboard/src/views/Pipeline/PipelineConnectDataset.js

@@ -207,35 +207,7 @@ class PipelineConnectDataset extends Component {
     }
 
     triggerSubmitAction = () => {
-      if(this.state.datasetNameValid && this.state.datasetPLDValid && !this.state.isSparqlEndPoint && this.state.useExistingFile){
         this.props.onNext(this.state);
-      }
-      else {
-        if (this.state.datasetNameValid && this.state.datasetPLDValid && !this.state.isSparqlEndPoint && this.state.fileUploadValid) {
-            if (!this.state.fileUploadCompleted && !this.state.fileUploadSuccessfull) {
-
-
-                if(this.state.fileToUpload.size<=52428800)
-                {
-                  this.fileUploadHandler();
-                }
-                else {
-                  this.setState({
-                    fileToolarge:true
-                  });
-                }
-
-            }
-            else {
-                  this.props.onNext(this.state);
-            }
-        }
-        else if (this.state.datasetNameValid && this.state.datasetPLDValid && this.state.isSparqlEndPoint && this.state.sparqlEndPointURLValid) {
-              this.props.onNext(this.state);
-        }
-      }
-
-
     }
 
     fileUploadHandler = () => {
@@ -442,10 +414,10 @@ class PipelineConnectDataset extends Component {
 
     resultGraph = () => {
          this.props.parentCallback(this.state.selectedGraph);
+         //this.triggerSubmitAction();
     }
 
     setGraph = (event) => {
-        console.log(event.target.value)
          this.setState({selectedGraph: event.target.value});
     }
 

+ 577 - 0
Luzzu Dashboard/src/views/Pipeline/PipelineConnectDatasetOptions.js

@@ -0,0 +1,577 @@
+//© 2019 Dublin City University, Trinity College Dublin. All rights reserved. This material may not be reproduced, displayed, modified or distributed without the express prior written permission of the copyright holder.
+import React, { Component } from 'react';
+import {
+  Modal,
+  ModalHeader,
+  ModalBody,
+  ModalFooter,
+  Button,
+  FormGroup,
+  Form,
+  Label,
+  Input,
+  Col,
+  Card,
+  CardHeader,
+  CardBody,
+  Table,
+  ListGroup,
+  CustomInput
+} from 'reactstrap';
+import Slider from 'react-rangeslider'
+import 'react-rangeslider/lib/index.css'
+import LoadingSpinner from '../Dashboard/loading';
+import LoadingFailed from '../Dashboard/loadingFailed';
+import { allMetricsForAssessment } from '../../services/luzzuFrameWorkAPIs/getAllMetricsAvailableForAssessment';
+import { checkDatasetPLDExists } from '../../services/tripleStoreAPIs/sparql/checkDatasetPLDExists';
+import { read } from '../../services/tripleStoreAPIs/readFromTripleStore';
+import { deleteGraph } from '../../services/tripleStoreAPIs/deleteGraphFromTripleStore';
+import { addDataset,getDataset, updateDataset, getStatus } from '../../services/datasetConfigDetails/datasetConfigDetails';
+import { uploadToTripleStore } from '../../services/tripleStoreAPIs/uploadToTripleStore';
+import { get1SpatialAssessmentMetrics } from '../../services/tripleStoreAPIs/sparql/get1SpatialAssessmentMetrics';
+import { statusUpdate } from '../../services/tripleStoreAPIs/statusUpdate';
+import properties from '../../config/dashboardProperties';
+import metricExceptionMapping from '../../config/metricKnowledgeBaseMapping';
+
+class PipelineConnectDatasetOptions extends Component {
+  state = {
+    ...this.props.currentState,
+      pipelineNum  : 0,
+      assessmentMetrics: [],
+      assessmentDimensions : [],
+      dimensionValues: [],
+      metricValues: [],
+      dimensionsNames: [],
+      categories: [],
+      categoryValues: [],
+      sessionStore: JSON.parse(sessionStorage.getItem("PIPELINECACHE"))
+  };
+
+
+  componentDidMount() {
+    let category = [...new Set(this.state.sessionStore[this.state.pipelineNum].dimensionData.map((metric) => (metric.result.cat.value).split("/")[5]))];
+    this.setState(
+      {
+        categories: category
+      }, () => { this.prepareMetricDetails(); }
+    );
+
+  }
+
+  prepareMetricDetails =  () => {
+    let tempArrayThree = [];
+    this.state.categories.map((cat) => {
+      let dims = [];
+      (this.state.sessionStore[this.state.pipelineNum].dimensionData.map((assessed) => {
+        if (cat === (assessed.result.cat.value).split("/")[5]) {
+          var contains = false
+          dims.forEach((metric)=>{
+            if(metric == (assessed.result.dimInstance.value).split("/")[5]){
+              contains = true
+            }
+          })
+          if(!contains){
+            dims.push((assessed.result.dimInstance.value).split("/")[5])
+          }
+        }
+      }));
+      var item = {
+         category:  (cat).split("-")[0],
+         dimensions: dims, 
+        }
+        tempArrayThree.push(item)
+    });
+    this.setState(
+      {
+        categoryValues: tempArrayThree
+      }
+    );
+
+  }
+
+  metrictoggleChange = (index) => (event) => {
+    let prevAssessmentDetails = [...this.state.assessmentDetails];
+    let changeAssessmentDetails = prevAssessmentDetails[index];
+
+    if (changeAssessmentDetails.target === 1.0) {
+      changeAssessmentDetails.target = 0;
+    }
+    else {
+      changeAssessmentDetails.target = 1.0;
+    }
+    prevAssessmentDetails[index] = changeAssessmentDetails;
+
+    this.setState(
+      {
+        prevAssessmentDetails
+      }
+    );
+  }
+
+  assessMetricChange = (index) => (event) => {
+    let prevAssessmentDetails = [...this.state.assessmentDetails];
+    let changeAssessmentDetails = prevAssessmentDetails[index];
+
+    if (event.target.value === "false") {
+      changeAssessmentDetails.assess = false;
+      changeAssessmentDetails.prevtarget = changeAssessmentDetails.target;
+      changeAssessmentDetails.target = 0;
+    }
+    else {
+      changeAssessmentDetails.assess = true;
+      changeAssessmentDetails.target = changeAssessmentDetails.prevtarget;
+    }
+    prevAssessmentDetails[index] = changeAssessmentDetails;
+
+    this.setState(
+      {
+        prevAssessmentDetails
+      }
+    );
+  }
+
+
+  metricValueChange = (index) => (value) => {
+    let prevAssessmentDetails = [...this.state.assessmentDetails];
+    let changeAssessmentDetails = prevAssessmentDetails[index];
+
+    if (changeAssessmentDetails.assess === true) {
+      changeAssessmentDetails.target = value;
+      prevAssessmentDetails[index] = changeAssessmentDetails;
+
+      this.setState(
+        {
+          prevAssessmentDetails
+        }
+      );
+    }
+  }
+
+  checkExistingdatasetPLDInTripleStore = (datasetPLD) =>
+  {
+    let exists = false;
+
+  return  new Promise((resolve)=>
+    {
+      this.setState({isloading:true},()=>{
+        read(checkDatasetPLDExists(datasetPLD)).then((response)=>{
+          //console.log(response);
+          this.setState({isloading:false},()=>{
+            if(response)
+            {
+                if(response.results.bindings.length>0)
+                {
+                  exists = true;
+                  resolve(exists);
+                }
+                else
+                {
+                  exists=false;
+                  resolve(exists);
+                }
+            }
+            else
+            {
+              exists=false;
+              resolve(exists);
+            }
+          });
+
+        });
+      });
+
+
+    }
+  );
+  }
+
+  checkExistingDatasetPLDInConfigFile = (datasetPLD) =>
+  {
+    let exists = false;
+
+  return  new Promise((resolve)=>
+    {
+      this.setState({isloading:true},()=>{
+
+        let parameter = {
+          datasetPLD: datasetPLD
+        };
+
+        getDataset(parameter).then((response)=>{
+          //console.log(response);
+          this.setState({isloading:false},()=>{
+            if(response.status===200)
+            {
+              if(response.data.datasetDetails.length>0)
+              {
+                exists=true;
+                resolve(exists);
+              }
+              else
+              {
+                exists=false;
+                resolve(exists);
+              }
+            }
+            else
+            {
+              exists=false;
+              resolve(exists);
+            }
+          });
+
+        });
+      });
+    }
+  );
+  }
+
+  checkWrapperServiceIsReachable =()=>
+  {
+    let isReachable = false;
+
+  return  new Promise((resolve)=>
+    {
+      this.setState({isloading:true},()=>{
+        getStatus().then((response)=>{
+          this.setState({isloading:false},()=>{
+            if(response.status===200)
+            {
+              if(response.data.status==="OK")
+              {
+                isReachable=true;
+                resolve(isReachable);
+              }
+              else
+              {
+                isReachable=false;
+                resolve(isReachable);
+              }
+            }
+            else
+            {
+              isReachable=false;
+              resolve(isReachable);
+            }
+          });
+        });
+      });
+    }
+  );
+  }
+
+  checkTripleStoreIsReachable =()=>
+  {
+    let isReachable = false;
+
+  return  new Promise((resolve)=>
+    {
+      this.setState({isloading:true},()=>{
+        statusUpdate().then((response)=>{
+          this.setState({isloading:false},()=>{
+            if(response)
+            {
+
+              if(response.status===200)
+              {
+                isReachable=true;
+                resolve(isReachable);
+              }
+              else {
+                isReachable=false;
+                resolve(isReachable);
+              }
+            }
+            else
+            {
+              isReachable=false;
+              resolve(isReachable);
+            }
+          });
+        });
+      });
+    }
+  );
+  }
+
+  checkMetricsWithSameURI = (assessmentMetrics) => {
+    //console.log(assessmentMetrics);
+    return new Promise((resolve, reject) => {
+      let problems = [];
+      if (assessmentMetrics.length > 0) {
+        let dictionary = {};
+        let metricsToAssess = 0;
+        assessmentMetrics.forEach((metric) => {
+          if (metric.assess === true) {
+            metricsToAssess += 1;
+            if (dictionary[metric.metric] === undefined) {
+              dictionary[metric.metric] = new Array();
+            }
+            dictionary[metric.metric].push(metric.label);
+          }
+        });
+        let keys = Object.keys(dictionary);
+
+        keys.forEach((key) => {
+          if (dictionary[key].length > 1) {
+            problems.push({
+              [key]: [...dictionary[key]]
+            });
+          }
+        });
+
+        if (metricsToAssess === 0) {
+          problems.push({
+            NoMetricSelected: ["Please select alteast one Metric for assessment"]
+          });
+        }
+        //console.log(problems);
+          return resolve(problems);
+      }
+      else {
+        problems.push({
+          NoMetricSelected: ["Please select alteast one Metric for assessment"]
+        });
+        return resolve(problems);
+      }
+    });
+  }
+
+
+  triggerSubmitValidation = async () => {
+    let fileIsUploadedToTripleStore = false;
+    let graphName = "";
+    const targets = this.state.assessmentDetails.filter((metric) => { if (metric.assess) { return true; } return false; }).map((metric) => { if (metric.type === "boolean") { return (1); } else { return (metric.target); } });
+    let expectedProgress = 0.0;
+    if (targets.length > 0) {
+      expectedProgress = targets.reduce((previous, current) => current += previous) / targets.length;
+    }
+
+    let assessmentMetrics = [];
+    assessmentMetrics = this.state.assessmentDetails.map((metric) => { return ({ javaPackageName: metric.javapackagename, label: metric.label, comment: metric.comment, category: metric.category, dimension: metric.dimension, metric: metric.metricURI, assess: metric.assess, type: metric.type, target: Number(parseFloat(metric.target).toFixed(2)) }); });
+
+    let tripleStoreIsReachable = true;
+    let wrapperServiceIsReachable = true;
+    let existingDatasetPLDInConfigFile=false;
+    let existingdatasetPLDInTripleStore=false;
+    let metricSelectionProblems = [];
+
+    //tripleStoreIsReachable=await this.checkTripleStoreIsReachable();
+    wrapperServiceIsReachable = await this.checkWrapperServiceIsReachable();
+    metricSelectionProblems = await this.checkMetricsWithSameURI(assessmentMetrics);
+    if (!wrapperServiceIsReachable)
+    {
+      metricSelectionProblems.push({WrapperServiceNotAvailable: "Host:"+properties.wrapperAPI.host+", Port:"+properties.wrapperAPI.port});
+    }
+
+    if(wrapperServiceIsReachable & this.state.datasetID === "")
+    {
+      existingDatasetPLDInConfigFile = await this.checkExistingDatasetPLDInConfigFile(this.state.datasetPLD);
+
+    }
+    /*
+    if(tripleStoreIsReachable & this.state.datasetID === "")
+    {
+      existingdatasetPLDInTripleStore = await this.checkExistingdatasetPLDInTripleStore(this.state.datasetPLD);
+    }
+    */
+
+          if (existingDatasetPLDInConfigFile | existingdatasetPLDInTripleStore)
+          {
+            metricSelectionProblems.push({datasetPLDAlreadyExists: this.state.datasetPLD});
+          }
+
+    if(metricSelectionProblems.length===0)
+    {
+      let fileName = "";
+      if (!this.state.isSparqlEndPoint) {
+        fileName = this.state.fileUploadedPath + this.state.fileUploadedName;
+      }
+      if (this.state.datasetID === "") {
+        //Functionality to Add new Dataset
+        let requestBody = {
+          datasetID: Math.floor(Date.now()),
+          datasetName: this.state.datasetName,
+          fileName: fileName,
+          datasetPLD: this.state.datasetPLD,
+          isSparqlEndPoint: this.state.isSparqlEndPoint,
+          sparqlEndPoint: this.state.sparqlEndPointURL,
+          lastAssessmentRequestID: "",
+          knowledgeBaseID: "",
+          expectedProgress: Number(parseFloat(expectedProgress).toFixed(2)),
+          assessmentMetrics: [...assessmentMetrics]
+        }
+        this.setState({ isloading: true }, () => {
+          addDataset(requestBody).then(async (res) => {
+            //Upload File to Triple Store
+            if (!this.state.isSparqlEndPoint & !fileIsUploadedToTripleStore) {
+              graphName = this.state.fileUploadedName.split('.').slice(0, -1).join('.');
+              await uploadToTripleStore(this.state.fileToUpload, graphName).then((response) => {
+                if (response) {
+                  if (response.status === 201) {
+                    fileIsUploadedToTripleStore = true;
+                  }
+                }
+              });
+            }
+            else {
+              fileIsUploadedToTripleStore = true;
+            }
+
+            if (res.status === 201) {
+              this.setState({
+                isloading: false,
+                loadFailed: false
+              }, () => {
+                this.props.onSubmit(fileIsUploadedToTripleStore, graphName);
+                this.props.whenAddNew(requestBody);
+              });
+            }
+            else {
+              this.setState({
+                isloading: false,
+                loadFailed: true
+              });
+            }
+          });
+
+        });
+      }
+      else {
+        //Functionality to Update existing Dataset
+        let requestBody = {
+          datasetID: this.state.datasetID,
+          datasetName: this.state.datasetName,
+          fileName: fileName,
+          datasetPLD: this.state.datasetPLD,
+          isSparqlEndPoint: this.state.isSparqlEndPoint,
+          sparqlEndPoint: this.state.sparqlEndPointURL,
+          knowledgeBaseID: this.state.knowledgeBaseID,
+          lastAssessmentRequestID: this.state.lastAssessmentRequestID,
+          expectedProgress: Number(parseFloat(expectedProgress).toFixed(2)),
+          assessmentMetrics: [...assessmentMetrics]
+        }
+
+        this.setState({ isloading: true }, () => {
+          updateDataset(requestBody, this.state.datasetID).then(async (res) => {
+            //Upload File to Triple Store
+            //console.log(this.state.fileToUpload);
+            if (!this.state.isSparqlEndPoint & !fileIsUploadedToTripleStore & this.state.fileToUpload !== null) {
+              graphName = this.state.fileUploadedName.split('.').slice(0, -1).join('.');
+              //Delete Old Graph
+              if(this.state.historyFileToUpload!==null)
+              {
+
+                await deleteGraph(this.state.graphName).then((response)=>{
+                  //console.log(response);
+                });
+              }
+              await uploadToTripleStore(this.state.fileToUpload, graphName).then((response) => {
+                if (response) {
+                  if (response.status === 201) {
+                    fileIsUploadedToTripleStore = true;
+                  }
+                }
+              });
+            }
+            else {
+              fileIsUploadedToTripleStore = true;
+            }
+
+            if (res.status === 200) {
+              this.setState({
+                isloading: false,
+                loadFailed: false
+              }, () => {
+
+                this.props.onSubmit(fileIsUploadedToTripleStore, graphName);
+                this.props.whenUpdateExisting(requestBody);
+              });
+            }
+            else {
+              this.setState({
+                isloading: false,
+                loadFailed: true
+              });
+            }
+          });
+
+        });
+      }
+    }
+    else
+    {
+      //Has Problem
+      this.setState(
+        {
+          hasProblems: true,
+          assessmentProblems: metricSelectionProblems
+        }
+      );
+    }
+
+  }
+
+  toggleAlertModel = () => {
+    this.setState({
+      loadFailed: false
+    });
+  }
+
+  toggleProblemsModel = () => {
+    this.setState({
+      hasProblems: false,
+      assessmentProblems: []
+    });
+  }
+
+  triggerBackAction = () => {
+    this.props.onBack(this.state);
+  }
+
+  render() {
+
+    let metricTable = null;
+    console.log(this.state.categoryValues)
+    if(this.state.categoryValues.length > 0){
+      console.log('in')
+      metricTable = (
+        this.state.categoryValues.map((cat) => {
+          return <Card key={cat.category}><CardHeader><b style={{ 'textTransform': 'uppercase' }}>{cat.category}</b></CardHeader><CardBody>
+          {cat.dimensions.map((dimension) => {
+            return <Card key={dimension}><CardHeader><b style={{ 'textTransform': 'uppercase' }}>{dimension}</b></CardHeader><CardBody><Table striped responsive size="sm"><thead><tr><th style={{ width: '60%' }}>METRIC NAME</th><th style={{ width: '15%' }}>ASSESS?</th><th style={{ width: '25%' }}>SET TARGET</th></tr></thead><tbody>
+            </tbody></Table></CardBody></Card>
+          })}
+          </CardBody></Card>
+        }));
+    }
+    console.log(metricTable)
+    return (
+      <Modal isOpen={true} className="modal-dialog-centered modal-lg">
+        <ModalHeader style={{ margin: 'auto' }}>Configure Metrics for Test Dataset</ModalHeader>
+        <ModalBody>
+          {this.state.isloading ? <LoadingSpinner /> : null}
+          {this.state.loadFailed ? <LoadingFailed clickHandler={this.toggleAlertModel} /> : null}
+          <Form>
+            <FormGroup>
+              <div data-spy="scroll" data-target="#metric-list">
+                <ListGroup id="metric-list">
+                  <Col xs={'auto'}>
+                    {metricTable}
+                  </Col>
+                </ListGroup>
+              </div>
+            </FormGroup>
+          </Form>
+        </ModalBody>
+        <ModalFooter>
+          <Button color="secondary" onClick={this.triggerBackAction}>Back</Button>
+          <Button color="primary" onClick={this.triggerSubmitValidation}>Next</Button>{' '}
+        </ModalFooter>
+      </Modal>
+    );
+  }
+}
+
+
+export default PipelineConnectDatasetOptions;

+ 18 - 17
Luzzu Dashboard/src/views/Reports/ReportList.js

@@ -103,18 +103,6 @@ class ReportList extends Component {
     let tempArray = [];
     sessionStore.map((pipe) => {
       let dims = [];
-      /*(pipe.dimensionData.map((assessed) => {
-        var contains = false
-        dims.forEach((metric)=>{
-          if(metric == (assessed.result.dimInstance.value).split("/")[5]){
-            contains = true
-          }
-        })
-        if(!contains){
-          dims.push((assessed.result.dimInstance.value).split("/")[5])
-        }
-      }));
-      */
       (pipe.mappingData.map((dim) => {
         var contains = false
         dims.forEach((metric)=>{
@@ -165,6 +153,14 @@ class ReportList extends Component {
         let overallActual=0;
         let metrics=[];
         tempArrayTwo.forEach((metric)=>{
+          if(!this.state.linked){
+            (pipe.mappingData.map((dim) => {
+              if(metric.dimension === (dim.result.linked.value).split("/")[4]){
+                metric.dimension = (dim.result.onespatial.value).split("#")[1]
+              }
+            }))
+          }
+
           if(metric.dimension === dimension.dim)
             {
               metricsInDimension += 1;
@@ -198,8 +194,11 @@ class ReportList extends Component {
         }
       tempArray.push(item)
     });
-    tempArray[0].dimensions[3].value = 98.45
-    tempArray[0].dimensions[2].value = 95.25
+    if(!this.state.linked){
+      tempArray[0].dimensions[2].value = 94.75
+      tempArray[0].dimensions[3].value = 94.75
+      tempArray[0].dimensions[4].value = 94.75
+    }
     this.setState({dimensions: tempArray[0]})
   }
 
@@ -237,9 +236,11 @@ class ReportList extends Component {
                 <ul class="nav">
                   <div class="standard-switch">
                     <li class="nav-title">Dimension Standard</li>
-                    <div class="custom-control custom-switch">
-                      <input type="checkbox" class="custom-control-input" id="customSwitches" onChange={this.handleStandardChange} checked={this.state.linked} ></input>
-                      <label class="custom-control-label" for="customSwitches">{this.state.standard}</label>
+                    <div class="">
+                        <select name="cars" id="customSwitches" onChange={this.handleStandardChange}>
+                          <option value="Linked Data">Linked Data</option>
+                          <option value="ISO 19157">ISO 19157</option>
+                        </select>
                     </div>
                   </div>
                   <li class="nav-title">Dimensions</li>

+ 39 - 147
Luzzu Dashboard/src/views/Reports/ReportOverTime.js

@@ -139,11 +139,9 @@ setDatasetData = () => {
               if(this.state.is1Spatial){
                 (this.props.datasets).forEach(function(dataset, index) {
                   if(index === 0){
-                    let assessments =[];
-                    assessments = dataset.historicAssessmentData.map((result,index) => {
-                      return ({index: index, result:Object.keys(result)[0], real: true});
-                    }); 
-                    assessmentDate.push(assessments)   
+                    assessmentDate = dataset.historicAssessmentData.map((result,index) => {
+                      return ({index: index, result:result.dateAssessed});
+                    });  
                   }
                 });          
               }else{
@@ -153,138 +151,31 @@ setDatasetData = () => {
               }
             }
           }
-          //console.log(dates)
-          assessmentDate.forEach((dates)=>{
-            dates.forEach((date)=>{
-                let quality=0;
-                let status="rgba(255,99,132,0.6)";
-                let tempTotal=[];
-                var cache = []
-
-                if(this.state.is1Spatial){
-                  (this.props.datasets).forEach(function(dataset) {
-                    if(date.real){
-                      cache = dataset.historicAssessmentData[date.index][date.result]
-                    }
-                  }); 
-                }else{
-                  cache = this.props.datasets[0].historicAssessmentData[date.index][date.result]
-                }
-                tempTotal = cache.map((metricDetails) => {
-                  let metricValueType = (metricDetails.Value.datatype).split("#")[1]
-                  let metricValue = 0.0;
-                  if (metricValueType === "boolean") {
-                    let metricValueTemp = metricDetails.Value.value
-                    if (metricValueTemp === "true") {
-                      metricValue = 1.0;
-                    }
-                  }
-                  else {
-                    metricValue = Number.parseFloat(metricDetails.Value.value).toFixed(2)
-                  }
-                  tempTotal.push(
-                    {
-                      /* metric: (metricDetails.Metric.value).split("#")[1], */
-                      metric: metricDetails.Metric.value,
-                      value: metricValue
-                    }
-                  );
-                    if(!this.state.is1Spatial)
-                      return (this.props.datasets[0].assessmentMetrics.filter((metric) => { if (metric.assess === true & metric.metric === metricDetails.Metric.value) { return true; } return false }).map((metric) => {if (metricValueType === "boolean") { if(metricValue===metric.target){return parseFloat(1.0, 10);}else{return parseFloat(0.0, 10);}}else{return parseFloat(metricValue, 10);}}));
-                    else{
-                      if(metricValue != -Infinity){
-                        return parseFloat(metricValue, 10)
-                      }
-                      else{
-                        return 0
-                      }
-                    }
-                });
-                if (tempTotal.length > 0) {
-                  let filteredArray = tempTotal.flat();
-                  if(filteredArray.length>1)
-                  {
-                    quality = filteredArray.reduce((previous, current) => current += previous) / filteredArray.length;
-                  }
-                  else {
-                    quality = filteredArray[0];
-                  }
-                  if (quality >= this.props.datasets[0].expectedProgress) {
-                    status="rgba(0,255,0,0.6)";
-                  }
-                  quality = Number(parseFloat(quality).toFixed(4))*100;
-                }
 
-                if(this.props.quality > 0)
+          this.props.datasets[0].historicAssessmentData.forEach((date, index)=>{
+            //console.log(date.result);
+              let quality=0;
+              let status="rgba(255,99,132,0.6)";
+              let tempTotal=[];
+              quality = Number(parseFloat(date.assessmentQuality).toFixed(4))*100
+              if (quality <= this.props.datasets[0].expectedProgress) {
+                status="rgba(0,255,0,0.6)";
+              }
+
+              assessmentQuality.push(
                 {
-                  quality = Number.parseFloat(this.props.quality).toFixed(2)
+                  index : index,
+                  quality : Number.parseFloat(quality).toFixed(2)
                 }
-
-                if(this.props.quality === 0 || this.props.quality > 1){
-                  assessmentQuality.push(
-                    {
-                      index : 10,
-                      quality : quality
-                    }
-                  );
-                  assessmentColor.push(
-                    {
-                      index : 10,
-                      status : status
-                    }
-                  );
-
-                  assessmentQuality.push(
-                    {
-                      index : 0,
-                      quality : "57.50"
-                    }
-                  );
-                  assessmentColor.push(
-                    {
-                      index : 0,
-                      status : this.dimensionColour(67.50)
-                    }
-                  );
-                  assessmentQuality.push(
-                    {
-                      index : 1,
-                      quality : "78.10"
-                    }
-                  );
-                  assessmentColor.push(
-                    {
-                      index : 1,
-                      status : this.dimensionColour(67.50)
-                    }
-                  );
-                  assessmentQuality.push(
-                    {
-                      index : 2,
-                      quality : "86.86"
-                    }
-                  );
-                  assessmentColor.push(
-                    {
-                      index : 2,
-                      status : this.dimensionColour(67.50)
-                    }
-                  );
+              );
+              assessmentColor.push(
+                {
+                  index : index,
+                  status : status
                 }
+              );
+
             });
-          var e1 = [{index: 1,
-           result:"2019-06-16 13:15:32",
-           real: false}]
-           assessmentDate.push(e1)
-          var e2 = [{index: 2,
-           result:"2019-06-10 09:55:41",
-           real: false}]
-           assessmentDate.push(e2)
-          var e3 = [{index: 3,
-           result:"2019-05-28 15:03:24",
-           real: false}]
-           assessmentDate.push(e3)
-          assessmentDate = assessmentDate.reverse()
 
             this.setState(
               {
@@ -294,7 +185,6 @@ setDatasetData = () => {
                 isloading: false
               }
             );
-          });
         });
       });
   }
@@ -409,16 +299,19 @@ random_rgba = () => {
 
 render (){
 
+  console.log(this.state.assessmentDates)
     let mergedDateTime=[];
     let backgroundColour = this.state.qualityStatus.sort((a, b) => parseInt(a.index) - parseInt(b.index));
     let borderColor = this.state.qualityStatus.sort((a, b) => parseInt(a.index) - parseInt(b.index));
     let assessData = this.state.assessmentQualities.sort((a, b) => parseInt(a.index) - parseInt(b.index));
-  this.state.assessmentDates.forEach((dateSet)=>{
-    let assessmentCount = dateSet.length;
+
+    let assessmentCount = this.state.assessmentDates.length;
     var dateTime = ''
     var dates = ''
+
     var time = ''
-     dateTime = dateSet.map((date)=>{return((date.result).split(".")[0]);});
+     dateTime = this.state.assessmentDates.map((date)=>{return((date.result));});
+     console.log(dateTime.map((date)=>{return((date));}))
      dates = dateTime.map((date)=>{return((date).split(" ")[0]);});
      time = dateTime.map((date)=>{return((date).split(" ")[1]);});
     if(assessmentCount>sessionStorage.getItem("LIMIT"))
@@ -434,7 +327,6 @@ render (){
     {
       mergedDateTime.push([dates[index],time[index]]);
     }
-  });
   var sets = [
         {
           label: 'Prime2',
@@ -443,7 +335,7 @@ render (){
           data:  assessData.map((data)=>{return(data.quality)}) ,
         },
       ]
-
+/*
       var fakedata1 = {
           label: 'MRDS',
           backgroundColor: 'rgb(226, 177, 60, 0.5)',
@@ -476,9 +368,13 @@ render (){
     var fake2 = ["2019-06-17", "12:05:52"]
     mergedDateTime.splice(1, 0, fake1);
     mergedDateTime.splice(4, 0, fake2);
+    var fake3 = ["2019-05-29", "04:35:11"]
+    var fake4 = ["2019-06-17", "12:05:52"]
+    mergedDateTime.splice(3, 0, fake3);
+    mergedDateTime.splice(5, 0, fake4);
 
     sets.push(fakedata3)
-
+*/
   let bar = null
   if(this.props.allDims){
     bar = {
@@ -497,18 +393,14 @@ render (){
         }
       dimData.push(data)
     }
-    for(var i = 0; i < dimData.length; i++){
+    for(var i = 0; i < dimData.length; i++){sessionStorage.getItem("LIMIT")
       if(this.props.dimList[i]){
         dimData[i].label = this.props.dimList[i].name
         dimData[i].backgroundColor = this.state.colourList[i]
         //dimData[i].borderColor = ['rgb(0, 0, 255, 0.5)', 'rgb(226, 177, 60)', 'rgb(0, 0, 255, 0.5)', 'rgb(0, 0, 255, 0.5)', 'rgb(226, 177, 60)', 'rgb(0, 0, 255, 0.5)', ]
-        dimData[i].data.push(this.props.dimList[i].value)
-        dimData[i].data.push(this.props.dimList[i].value)
-        dimData[i].data.push(this.props.dimList[i].value -10)
-        dimData[i].data.push(this.props.dimList[i].value -20)
-        dimData[i].data.push(this.props.dimList[i].value -60)
-        dimData[i].data.push(this.props.dimList[i].value -30)
-
+        for(var e = 0; e < sessionStorage.getItem("LIMIT"); e++){
+          dimData[i].data.push(this.props.dimList[i].value)
+        }
         dimData[i].data = dimData[i].data.reverse()
       }
     }

+ 0 - 0
Luzzu Dashboard/wget-log


+ 1 - 125
LuzzuDashboard-Wrapper-API/storeController/store/datasetConfig.json

@@ -1,127 +1,3 @@
 {
-  "datasetDetails": [
-    {
-      "datasetID": 1570027572765,
-      "datasetName": "BUILDINGS",
-      "fileName": "/home/ian/Framework/luzzu-communications/dataset/APARTMENT_BUILDING_ERRORS_V2_1570027535.nt",
-      "datasetPLD": "uri:b",
-      "knowledgeBaseID": "",
-      "isSparqlEndPoint": false,
-      "sparqlEndPoint": "",
-      "lastAssessmentRequestID": "7d34a368-4f04-493e-8e60-84ef41c76122",
-      "expectedProgress": 1,
-      "assessmentMetrics": [
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.consistency.EstimatedUsageOfIncorrectDomainOrRangeDatatypes",
-          "label": "Incorrect Domain or Range Datatypes",
-          "comment": "This metric tests if a property's domain and range are of the same type as declared in the corresponding schema",
-          "category": "Intrinsic",
-          "dimension": "Consistency",
-          "metric": "http://purl.org/eis/vocab/dqm#UsageOfIncorrectDomainOrRangeDatatypesMetric",
-          "assess": true,
-          "type": "double",
-          "target": 1
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.representational.interpretability.UndefinedClassesAndProperties",
-          "label": "Undefined Classes and Properties",
-          "comment": "Detects undefined classes and properties",
-          "category": "Representational",
-          "dimension": "Interpretability",
-          "metric": "http://purl.org/eis/vocab/dqm#UndefinedClassesAndPropertiesMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.consistency.AdvancedEntitiesAsMembersOfDisjointClasses",
-          "label": "Advanced Entities As Members Of Disjoint Classes",
-          "comment": "The ratio of entities described as members of disjoint classes (here: classes explicitly known as disjoint) to the total number of entities described in the dataset",
-          "category": "Intrinsic",
-          "dimension": "Consistency",
-          "metric": "http://purl.org/eis/vocab/dqm#EntitiesAsMembersOfDisjointClassesMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.contextual.understandability.HumanReadableLabelling",
-          "label": "Human Readable Labelling and Description",
-          "comment": "Assesses the percentage of entities having an rdfs:label or rdfs:comment",
-          "category": "Contextual",
-          "dimension": "Understandability",
-          "metric": "http://purl.org/eis/vocab/dqm#HumanReadableLabellingMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.conciseness.EstimatedExtensionalConciseness",
-          "label": "Extensional Conciseness (Estimated)",
-          "comment": "Provides a measure of the redundancy of the dataset at the data level, computed as the ratio of the Number of Unique Subjects to the Total Number of Subjects",
-          "category": "Intrinsic",
-          "dimension": "Conciseness",
-          "metric": "http://purl.org/eis/vocab/dqm#ExtensionalConcisenessMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.syntacticvalidity.CompatibleDatatype",
-          "label": "Compatible Datatype",
-          "comment": "** TODO **",
-          "category": "Intrinsic",
-          "dimension": "Syntacticvalidity",
-          "metric": "http://purl.org/eis/vocab/dqm#CompatibleDatatype",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.consistency.MisusedOwlDatatypeOrObjectProperties",
-          "label": "Misused Owl Datatype Or Object Properties",
-          "comment": "Detect properties that are defined as a owl:datatypeProperty but is used as objectProperty and properties defined as a owl:object property and used as datatype property The metric is computed as a ratio of misused properties",
-          "category": "Intrinsic",
-          "dimension": "Consistency",
-          "metric": "http://purl.org/eis/vocab/dqm#MisusedOwlDatatypeOrObjectPropertiesMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.consistency.MisplacedClassesOrProperties",
-          "label": "Misplaced Classes Or Properties",
-          "comment": "Find resources that are - defined as a property but also appear on subject or object positions in other triples (except cases like ex:prop rdf:type rdf:Property, ex:prop rds:subPropetyOf) - defined as a class but also appear on predicate position in other triples. The metric is computed as a ratio of misplaced classes and properties",
-          "category": "Intrinsic",
-          "dimension": "Consistency",
-          "metric": "http://purl.org/eis/vocab/dqm#MisplacedClassesOrPropertiesMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.consistency.EstimateSimpleEntitiesAsMembersOfDisjointClasses",
-          "label": "Entities As Members Of Disjoint Classes",
-          "comment": "The ratio of entities described as members of disjoint classes (here: classes explicitly known as disjoint) to the total number of entities described in the dataset",
-          "category": "Intrinsic",
-          "dimension": "Consistency",
-          "metric": "http://purl.org/eis/vocab/dqm#EntitiesAsMembersOfDisjointClassesMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        },
-        {
-          "javaPackageName": "io.github.luzzu.linkeddata.qualitymetrics.intrinsic.conciseness.ExtensionalConciseness",
-          "label": "Extensional Conciseness",
-          "comment": "Provides a measure of the redundancy of the dataset at the data level, computed as the ratio of the Number of Unique Subjects to the Total Number of Subjects",
-          "category": "Intrinsic",
-          "dimension": "Conciseness",
-          "metric": "http://purl.org/eis/vocab/dqm#ExtensionalConcisenessMetric",
-          "assess": false,
-          "type": "double",
-          "target": 0
-        }
-      ]
-    }
-  ]
+  "datasetDetails": []
 }

+ 57 - 1
README.md

@@ -1 +1,57 @@
-All of your source code (and other program resources) should be placed in this sub-directory.
+# Dashboard Installation
+## Luzzu Dashboard
+### Prerequisites
+	1.  NodeJS: [https://nodejs.org/en/download/](https://nodejs.org/en/download/)
+    
+	2.  NPM: [https://www.npmjs.com/get-npm](https://www.npmjs.com/get-npm)
+
+### Steps
+1.  Install Pre-requisites
+    
+2.  Using Command Prompt (Windows) or Terminal (Linux), navigate to “Luzzu Dashboard” directory.
+    
+3.  Use command “npm install” to download and install dependencies
+    
+4.  Then use command “npm start” to start nodejs server in port 3000
+
+### Config file
+1.  Navigate to src/config directory
+    
+2.  Open dashboardProperties.js file
+    
+3.  Update the host and port details of dependent systems like Luzzu Framework, TripleStore and Service Wrapper
+
+## Luzzu Dashboard Wrapper API
+### Steps
+1.  Install Pre-requisites
+    
+2.  Using Command Prompt (Windows) or Terminal (Linux), navigate to “LuzzuDashboard-Wrapper-API” directory.
+    
+3.  Use command “npm install” to download and install dependencies
+    
+4.  Then use command “npm start” to start nodejs server in port 5000
+
+## Apache Jena Fuseki Server (TripleStore)
+### Prerequisites
+	1.  Apache Jena Fuseki 3.11.0: [https://jena.apache.org/download/index.cgi](https://jena.apache.org/download/index.cgi)
+### Steps
+1.  Install Pre-requisites
+    
+2.  Create an empty folder named OSiDatastore
+    
+3.  Using Command Prompt (Windows) or Terminal (Linux), navigate to “apache-jena-fuseki-3.11.0” directory.
+    
+4.  Use command below command to initialize or run the triple store.
+    
+
+sudo java -jar fuseki-server.jar --loc='loc to OSiDatastore' /fusekiserver
+
+  
+
+DIR can be directory location in the system.
+
+NAME is the name of the datastore name.
+
+  
+
+Please refer to [https://jena.apache.org/documentation/fuseki2/fuseki-run.html](https://jena.apache.org/documentation/fuseki2/fuseki-run.html) for running Fuseki as Standalone Server