/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.fdxcommons.tools.database.queries; import com.megatim.fdxcommons.model.pojo.JsonTableDefinition; import com.megatim.fdxcommons.tools.database.contrat.DefaultPreparedStatementProcessor; import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.queries.metadata.WhereQueryParameters; import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.ParentIdColumnDefinition; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import java.util.Map; /** * * @author ASUS */ public class JsonCountQuery implements QueryMetaData { private final JsonTableDefinition tableDefinition; private final Connection connection; private final QueryCriterion queryCriterion; private final Map tablesNameToAlias; public JsonCountQuery(JsonTableDefinition tableDefinition, QueryCriterion queryCriterion, Connection connection, Map tablesNameToAlias) { this.connection = connection; this.queryCriterion = queryCriterion; this.tableDefinition = tableDefinition; this.tablesNameToAlias = tablesNameToAlias; } @Override public Long execute() throws Exception { String query = countString() + fromString() + joinString() + whereString(); System.out.println("countQuery = " + query); try ( PreparedStatement statement = connection.prepareStatement(query)) { new DefaultPreparedStatementProcessor().process(statement, new WhereQueryParameters(queryCriterion).parameters()); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return resultSet.getLong(1); } return 0L; } } private String countString() { StringBuilder query = new StringBuilder("SELECT COUNT("); query.append("DISTINCT(") .append(tablesNameToAlias.get(tableDefinition.getTableName())) .append(".") .append(new IndexColumnDefinition().name()) .append("))"); return query.toString(); } private String whereString() { return "\n" + new WhereQueryString(queryCriterion).query(); } private String fromString() { StringBuilder fromPart = new StringBuilder("\nFROM "); fromPart .append(tableDefinition.getTableName()) .append(" ") .append(tablesNameToAlias.get(tableDefinition.getTableName())); return fromPart.toString(); } private String joinString() { return joinString(tableDefinition.getTablesDefinition()); } private String joinString(List tablesDef) { StringBuilder joinPart = new StringBuilder(""); if (tablesNameToAlias.size() > 1) { for (JsonTableDefinition t : tablesDef) { joinPart.append(joinString(t)); joinPart.append(joinString(t.getTablesDefinition())); } } return joinPart.toString(); } private String joinString(JsonTableDefinition tableDef) { StringBuilder joinPart = new StringBuilder("\nJOIN "); joinPart.append(tableDef.getTableName()) .append(" ") .append(tablesNameToAlias.get(tableDef.getTableName())) .append(" ON ") .append(tablesNameToAlias.get(tableDef.getTableName())) .append(".") .append(new ParentIdColumnDefinition().name()) .append(" = ") .append(tablesNameToAlias.get(tableDef.getParentTableName())) .append(".") .append(new IndexColumnDefinition().name()); return joinPart.toString(); } }