Add filtering capability for showing VMEmissionSummary

This commit is contained in:
Ali Sadeghi
2025-08-08 17:45:29 +03:30
parent bc670a4dfa
commit 97d2ad154d
9 changed files with 99 additions and 27 deletions

View File

@@ -865,7 +865,7 @@ public class SgsApplication implements CommandLineRunner {
if (neighborhoodService.findAll().isEmpty()) {
createNeighborhoodsFromJson();
}
if (areaService.findAll().isEmpty()) {
if (!cityService.findAll().isEmpty()) {
createDefaultArea();
}
}

View File

@@ -15,8 +15,10 @@ import org.springframework.stereotype.Component;
import com.sgs.graphql.auth.service.AuthorizationService;
import com.sgs.graphql.dataCenter.domain.DataCenter;
import com.sgs.graphql.dataCenter.domain.PhysicalMachine;
import com.sgs.graphql.dataCenter.query.pagination.DataCenterPageable;
import com.sgs.graphql.dataCenter.repo.DataCenterRepo;
import com.sgs.graphql.dataCenter.repo.PhysicalMachineRepo;
import com.sgs.graphql.dataCenter.repo.criteria.DataCenterCriteria;
import com.sgs.graphql.dataCenter.service.DataCenterService;
import com.sgs.graphql.systemHistory.mutation.SystemLogger;
@@ -30,13 +32,15 @@ public class DataCenterQueryResolver implements GraphQLQueryResolver {
private final DataCenterService DataCenterService;
private final DataCenterRepo dataCenterRepo;
private final PhysicalMachineRepo physicalMachineRepo;
private final AuthorizationService authorizationService;
private final SystemLogger systemLogger;
@Autowired
public DataCenterQueryResolver(AuthorizationService authorizationService, SystemLogger systemLogger, DataCenterService DataCenterService, DataCenterRepo dataCenterRepo) {
public DataCenterQueryResolver(AuthorizationService authorizationService, SystemLogger systemLogger, DataCenterService DataCenterService, DataCenterRepo dataCenterRepo, PhysicalMachineRepo physicalMachineRepo) {
this.DataCenterService = DataCenterService;
this.dataCenterRepo = dataCenterRepo;
this.physicalMachineRepo = physicalMachineRepo;
this.authorizationService = authorizationService;
this.systemLogger = systemLogger;
}
@@ -66,4 +70,8 @@ public class DataCenterQueryResolver implements GraphQLQueryResolver {
return dataCenterRepo.findByNumber(id).stream().findFirst();
}
public List<PhysicalMachine> physicalMachines(UUID datacenterId, UUID projectId) {
return physicalMachineRepo.findByDatacenterIdAndProjectId(datacenterId, projectId);
}
}

View File

@@ -0,0 +1,27 @@
package com.sgs.graphql.dataCenter.repo;
import com.sgs.graphql.dataCenter.domain.PhysicalMachine;
import com.sgs.lib.dao.repo.BaseRepo;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.UUID;
@Repository
public interface PhysicalMachineRepo extends BaseRepo<PhysicalMachine> {
/**
* Find all physical machines by datacenter ID and project ID
* @param datacenterId Datacenter ID
* @param projectId Project ID
* @return List of physical machines
*/
@Query("SELECT pm FROM PhysicalMachine pm " +
"JOIN pm.project p " +
"JOIN p.dataCenter dc " +
"WHERE dc.id = :datacenterId AND p.id = :projectId")
List<PhysicalMachine> findByDatacenterIdAndProjectId(@Param("datacenterId") UUID datacenterId,
@Param("projectId") UUID projectId);
}

View File

@@ -51,9 +51,11 @@ public class MainDataTableQueryResolver implements GraphQLQueryResolver {
/**
* GraphQL query to get VM emission summaries with hierarchy information
* @param datacenterId Optional datacenter ID to filter VMs by datacenter
* @param projectId Optional project ID to filter VMs by project
* @return List of VM emission summaries including datacenter, project, aggregate, and physical machine info
*/
public List<VMEmissionSummary> vmEmissionSummary() {
return mainDataTableService.getVMEmissionSummaries();
public List<VMEmissionSummary> vmEmissionSummary(UUID datacenterId, UUID projectId) {
return mainDataTableService.getVMEmissionSummaries(datacenterId, projectId);
}
}

View File

@@ -9,6 +9,7 @@ import com.sgs.lib.dao.service.BaseService;
import com.sgs.graphql.mainDataTable.dto.VMEmissionSummary;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -32,12 +33,33 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
}
public List<VMEmissionSummary> getVMEmissionSummaries() {
return getVMEmissionSummaries(null, null);
}
public List<VMEmissionSummary> getVMEmissionSummaries(UUID datacenterId) {
return getVMEmissionSummaries(datacenterId, null);
}
public List<VMEmissionSummary> getVMEmissionSummaries(UUID datacenterId, UUID projectId) {
List<String> whereConditions = new ArrayList<>();
if (datacenterId != null) {
whereConditions.add("dc.id = decode(replace(:datacenterId, '-', ''), 'hex')");
}
if (projectId != null) {
whereConditions.add("p.id = decode(replace(:projectId, '-', ''), 'hex')");
}
String whereClause = whereConditions.isEmpty() ? "" :
"WHERE " + String.join(" AND ", whereConditions) + " ";
String sql = """
SELECT
CAST(v.id AS VARCHAR) as vm_id,
v.name as vm_name,
v.vm_name as vm_name,
v.power as vm_power,
v.status as vm_status,
v.state as vm_status,
mdt.total_emission,
mdt.created_date,
pm.name as physical_machine_name,
@@ -48,15 +70,24 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
mdt.n2o
FROM main_data_table mdt
JOIN vm v ON mdt.vm_id = v.id
LEFT JOIN vms vms_active ON v.active_vms_id = vms_active.id
LEFT JOIN vms vms_inactive ON v.inactive_vms_id = vms_inactive.id
LEFT JOIN physical_machine pm ON (pm.vms_id = vms_active.id OR pm.vms_id = vms_inactive.id)
LEFT JOIN physical_machine pm ON v.physical_machine_id = pm.id
LEFT JOIN project p ON pm.project_id = p.id
LEFT JOIN data_center dc ON p.data_center_id = dc.id
ORDER BY mdt.created_date DESC, v.name
""" + whereClause + """
ORDER BY mdt.created_date DESC, v.vm_name
""";
Query query = entityManager.createNativeQuery(sql);
// Add parameters if provided
if (datacenterId != null) {
query.setParameter("datacenterId", datacenterId.toString());
}
if (projectId != null) {
query.setParameter("projectId", projectId.toString());
}
@SuppressWarnings("unchecked")
List<Object[]> results = query.getResultList();

View File

@@ -3,4 +3,5 @@ extend type Query{
dataCenters(criteria: DataCenterCriteria, sortBy: [SortBy!]): [DataCenter!]
paginateDataCenters(pagination : Pagination!, criteria: DataCenterCriteria, sortBy:[SortBy!] ) : DataCenterPageable!
getByNumber(number: Int!): DataCenter
physicalMachines(datacenterId: ID!, projectId: ID!): [PhysicalMachine!]!
}

View File

@@ -25,6 +25,7 @@ type Project {
id: ID
name: String
physicalMachines: [PhysicalMachine]
dataCenter: DataCenter
}
type PhysicalMachine {
@@ -34,6 +35,7 @@ type PhysicalMachine {
tag: String
power: Float
vms: [Vm]
project: Project
}
type Vm {
@@ -49,6 +51,7 @@ type Vm {
tag: String
emissionSource: EmissionSourceMap
config: Config
physicalMachine: PhysicalMachine
}
scalar EmissionSourceMap

View File

@@ -2,5 +2,5 @@ extend type Query{
mainDataTable(id: ID!): MainDataTable!
mainDataTables(criteria: MainDataTableCriteria, sortBy: [SortBy!]): [MainDataTable!]
paginateMainDataTables(pagination : Pagination!, criteria: MainDataTableCriteria, sortBy:[SortBy!] ) : MainDataTablePageable!
vmEmissionSummary: [VMEmissionSummary!]!
vmEmissionSummary(datacenterId: ID, projectId: ID): [VMEmissionSummary!]!
}

View File

@@ -51,9 +51,9 @@ type Config {
disk: Int
}
type VMEmissionSummary {
type VMEmissionSummary {
vmId: ID!
vmName: String!
vmName: String
vmPower: Float
vmStatus: String
totalEmission: Float!
@@ -66,7 +66,7 @@ type VMEmissionSummary {
ch4: Float!
n2o: Float!
reportGeneratedTime: LocalDateTime
}
}
type SolidWasteSupplement {
id: ID!