package com.isec.iot.dao.dataanalysis.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import com.isec.iot.dao.dataanalysis.DataMAnalysisDao;
import com.isec.iot.dao.mongodb.MongoDBBaseDao;
import com.isec.iot.entity.CollectionData;
@Repository
public class DataMAnalysisDaoImpl extends MongoDBBaseDao<CollectionData> implements DataMAnalysisDao {
@Override
public List<Object> searchCharts(Criteria criteria,String collectionName) {
//Date date1=new Date();
//第一個參數将内嵌的隻文檔張開,第二個參數查詢條件,第3個為需要的字段,第四為按哪些字段排序
Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values"),Aggregation.match(criteria),Aggregation.project("values","time")
,Aggregation.sort(Sort.Direction.ASC,"time","values.t"));
AggregationResults<Object> results=mongoTemplate.aggregate(aggregation,collectionName, Object.class);
List<Object> objs=results.getMappedResults();
//Date date2=new Date();
// System.out.println("===================================dao==========="+(date2.getTime()/1000-date1.getTime()/1000)+"s===========================================================");
return objs;
}
///每個結構物的餅圖
@Override
public List<Map<String, Object>> searchCakes(Criteria criteria, String collectionName) {
List<Map<String,Object>> list=new ArrayList<>();
Aggregation aggregation=Aggregation.newAggregation(Aggregation.match(criteria),Aggregation.group("product_name").count().as("count"));
AggregationResults<Object> results=mongoTemplate.aggregate(aggregation,collectionName, Object.class);
List<Object> objects=results.getMappedResults();
for(Object o:objects) {
Map<String, Object> map=new HashMap<>();
Map<String, Object> map1=(Map<String, Object>) o;
map.put("name", map1.get("_id"));//id自動為分組的字段,--------------------單個分組是_id,多個分組則會吧分組字段傳回
map.put("value", map1.get("count"));
list.add(map);
}
return list;
}
///每個結構物的資料流折線圖
@Override
public List<Map<String, Object>> searchStructureOfLine(Criteria criteria, String collectionName) {
List<Map<String, Object>> list=new ArrayList<>();
Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values"),
Aggregation.match(criteria),
Aggregation.group("time").count().as("count"),Aggregation.sort(Direction.ASC,"_id"));
AggregationResults<Object> results=mongoTemplate.aggregate(aggregation, collectionName,Object.class);
List<Object> objects=results.getMappedResults();
for(Object object:objects) {
Map<String, Object > map=new HashMap<>();
Map<String, Object > map2=(Map<String, Object>) object;
map.put("name", map2.get("_id"));
map.put("value", map2.get("count"));
list.add(map);
}
return list;
}
@Override
public List<Object> searchMM(Criteria criteria, String collectionName) {
List<Object> list=new ArrayList<>();
Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values")
,Aggregation.match(criteria)
,Aggregation.group("key").max("values.v").as("max").min("values.v").as("min"));
AggregationResults<Object> mResults=mongoTemplate.aggregate(aggregation,collectionName,Object.class);
list=mResults.getMappedResults();
return list;
}
@Override
public List<Object> searchReleDatas(Criteria criteria, String collectionName) {
List<Object> list=new ArrayList<>();
Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values")
,Aggregation.match(criteria)
,Aggregation.project("time","values")
,Aggregation.sort(Sort.Direction.ASC,"time","values.t")
);
AggregationResults<Object> mAggregationResults=mongoTemplate.aggregate(aggregation,collectionName, Object.class);
list=mAggregationResults.getMappedResults();
return list;
}
//查一天的資料
@Override
public CollectionData findByQuery(Query query, String collectionName) {
return mongoTemplate.findOne(query, CollectionData.class,collectionName);
}
}