[DEV] continue normalisation API

This commit is contained in:
Edouard DUPIN 2023-12-18 07:32:46 +01:00
parent d9fcacc812
commit 3b0c73bd55
5 changed files with 143 additions and 89 deletions

View File

@ -25,9 +25,9 @@ import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
import org.kar.archidata.dataAccess.addOn.AddOnManyToMany;
import org.kar.archidata.dataAccess.addOn.AddOnManyToOne;
import org.kar.archidata.dataAccess.addOn.AddOnSQLTableExternalForeinKeyAsList;
import org.kar.archidata.dataAccess.options.AccessDeletedItems;
import org.kar.archidata.dataAccess.options.CheckFunction;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.FilterValue;
import org.kar.archidata.db.DBEntry;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
@ -679,8 +679,8 @@ public class DataAccess {
return update(data, id, null);
}
public static <T> int updateWhere(final T data, final QueryItem condition) throws Exception {
return updateWhere(data, condition, null, null);
public static <T> int updateWhere(final T data, final QueryOptions options) throws Exception {
return updateWhere(data, options, null);
}
/** @param <T>
@ -690,11 +690,22 @@ public class DataAccess {
* @return the affected rows.
* @throws Exception */
public static <T, ID_TYPE> int update(final T data, final ID_TYPE id, final List<String> filterValue) throws Exception {
return updateWhere(data, getTableIdCondition(data.getClass(), id), null, filterValue);
return updateWhere(data, new Condition(getTableIdCondition(data.getClass(), id)), filterValue);
}
public static <T> int updateWhere(final T data, final QueryItem condition, final QueryOptions options, final List<String> filterValue) throws Exception {
// il y avait: final List<String> filterValue
public static <T> int updateWhere(final T data, final QueryOption... option) throws Exception {
final Class<?> clazz = data.getClass();
QueryOptions options = new QueryOptions(option);
Condition condition = options.get(Condition.class);
if (condition == null) {
throw new DataAccessException("request a gets without any condition");
}
FilterValue filter = options.get(FilterValue.class);
if (filter == null) {
throw new DataAccessException("request a gets without any filter values");
}
// public static NodeSmall createNode(String typeInNode, String name, String description, Long parentId) {
// External checker of data:
@ -755,7 +766,7 @@ public class DataAccess {
}
query.append(" ");
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
whereAppendQuery(query, tableName, condition, null, deletedFieldName);
condition.whereAppendQuery(query, tableName, null, deletedFieldName);
firstField = true;
LOGGER.debug("generate the query: '{}'", query.toString());
// prepare the request:
@ -791,7 +802,7 @@ public class DataAccess {
addOn.insertData(ps, field, data, iii);
}
}
whereInjectValue(ps, condition, iii);
condition.injectQuerry(ps, iii);
return ps.executeUpdate();
} catch (final SQLException ex) {
ex.printStackTrace();
@ -834,45 +845,6 @@ public class DataAccess {
}
}
public static void whereAppendQuery(final StringBuilder query, final String tableName, final QueryItem condition, final QueryOptions options, final String deletedFieldName) {
boolean exclude_deleted = true;
if (options != null) {
exclude_deleted = !options.exist(AccessDeletedItems.class);
}
// Check if we have a condition to generate
if (condition == null) {
if (exclude_deleted && deletedFieldName != null) {
query.append(" WHERE ");
query.append(tableName);
query.append(".");
query.append(deletedFieldName);
query.append(" = false ");
}
return;
}
query.append(" WHERE (");
condition.generateQuerry(query, tableName);
query.append(") ");
if (exclude_deleted && deletedFieldName != null) {
query.append("AND ");
query.append(tableName);
query.append(".");
query.append(deletedFieldName);
query.append(" = false ");
}
}
public static void whereInjectValue(final PreparedStatement ps, final QueryOptions options, final CountInOut iii) throws Exception {
// Check if we have a condition to generate
if (options != null) {
final Condition condition = options.get(Condition.class);
if (condition != null) {
condition.injectQuerry(ps, iii);
}
}
}
public static int executeSimpleQuerry(final String query, final boolean root) throws SQLException, IOException {
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig, root);
final Statement stmt = entry.connection.createStatement();
@ -893,15 +865,9 @@ public class DataAccess {
return executeQuerry(query, false);
}
public static <T> T getWhere(final Class<T> clazz, QueryOptions options) throws Exception {
return getWhere(clazz, options);
if (options == null) {
options = new QueryOptions();
}
final Limit limit = options.get(Limit.class);
if (limit != null) {
options.add(new Limit(1));
}
public static <T> T getWhere(final Class<T> clazz, QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
options.add(new Limit(1));
final List<T> values = getsWhere(clazz, options);
if (values.size() == 0) {
return null;
@ -909,9 +875,7 @@ public class DataAccess {
return values.get(0);
}
public static <T> List<T> getsWhere(final Class<T> clazz, final QueryItem condition) throws Exception {
return getsWhere(clazz, condition, null);
}
/* public static <T> List<T> getsWhere(final Class<T> clazz, final QueryItem condition) throws Exception { return getsWhere(clazz, condition, null); } */
public static void generateSelectField(final StringBuilder querySelect, final StringBuilder query, final Class<?> clazz, final QueryOptions options, final CountInOut count) throws Exception {
final boolean readAllfields = QueryOptions.readAllColomn(options);
@ -949,8 +913,17 @@ public class DataAccess {
}
}
public static <T> List<T> getsWhere(final Class<T> clazz, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
return getsWhere(clazz, options);
}
@SuppressWarnings("unchecked")
public static <T> List<T> getsWhere(final Class<T> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
public static <T> List<T> getsWhere(final Class<T> clazz, final QueryOptions options) throws Exception {
Condition condition = options.get(Condition.class);
if (condition == null) {
throw new DataAccessException("request a gets without any condition");
}
final List<LazyGetter> lazyCall = new ArrayList<>();
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
@ -969,7 +942,7 @@ public class DataAccess {
generateSelectField(querySelect, query, clazz, options, count);
querySelect.append(query.toString());
query = querySelect;
whereAppendQuery(query, tableName, condition, options, deletedFieldName);
condition.whereAppendQuery(query, tableName, options, deletedFieldName);
final OrderBy orders = options.get(OrderBy.class);
if (orders != null) {
orders.generateQuerry(query, tableName);
@ -982,7 +955,7 @@ public class DataAccess {
// prepare the request:
final PreparedStatement ps = entry.connection.prepareStatement(query.toString(), Statement.RETURN_GENERATED_KEYS);
final CountInOut iii = new CountInOut(1);
whereInjectValue(ps, condition, iii);
condition.injectQuerry(ps, iii);
// execute the request
final ResultSet rs = ps.executeQuery();
while (rs.next()) {
@ -1039,8 +1012,10 @@ public class DataAccess {
return get(clazz, id, null);
}
public static <T, ID_TYPE> T get(final Class<T> clazz, final ID_TYPE id, final QueryOptions options) throws Exception {
return DataAccess.getWhere(clazz, getTableIdCondition(clazz, id), options);
public static <T, ID_TYPE> T get(final Class<T> clazz, final ID_TYPE id, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
options.add(new Condition(getTableIdCondition(clazz, id)));
return DataAccess.getWhere(clazz, options.getAllArray());
}
public static String getCurrentTimeStamp() {
@ -1048,11 +1023,11 @@ public class DataAccess {
}
public static <T> List<T> gets(final Class<T> clazz) throws Exception {
return getsWhere(clazz, null);
return getsWhere(clazz);
}
public static <T> List<T> gets(final Class<T> clazz, final QueryOptions options) throws Exception {
return getsWhere(clazz, null, options);
public static <T> List<T> gets(final Class<T> clazz, final QueryOption... option) throws Exception {
return getsWhere(clazz, option);
}
public static <ID_TYPE> int delete(final Class<?> clazz, final ID_TYPE id) throws Exception {
@ -1065,7 +1040,7 @@ public class DataAccess {
* @param id Unique Id of the model
* @param options (Optional) Options of the request
* @return Number of element that is removed. */
public static <ID_TYPE> int delete(final Class<?> clazz, final ID_TYPE id, final QueryOptions options) throws Exception {
public static <ID_TYPE> int delete(final Class<?> clazz, final ID_TYPE id, final QueryOption... options) throws Exception {
final String hasDeletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
if (hasDeletedFieldName != null) {
return deleteSoft(clazz, id, options);
@ -1079,20 +1054,28 @@ public class DataAccess {
* @param condition Condition to remove elements.
* @param options (Optional) Options of the request.
* @return Number of element that is removed. */
public static int deleteWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
public static int deleteWhere(final Class<?> clazz, final QueryOption... option) throws Exception {
final String hasDeletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
if (hasDeletedFieldName != null) {
return deleteSoftWhere(clazz, condition, options);
return deleteSoftWhere(clazz, option);
} else {
return deleteHardWhere(clazz, condition, options);
return deleteHardWhere(clazz, option);
}
}
public static <ID_TYPE> int deleteHard(final Class<?> clazz, final ID_TYPE id, final QueryOptions options) throws Exception {
return deleteHardWhere(clazz, getTableIdCondition(clazz, id), options);
public static <ID_TYPE> int deleteHard(final Class<?> clazz, final ID_TYPE id, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
options.add(new Condition(getTableIdCondition(clazz, id)));
return deleteHardWhere(clazz, options.getAllArray());
}
public static int deleteHardWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
public static int deleteHardWhere(final Class<?> clazz, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
Condition condition = options.get(Condition.class);
if (condition == null) {
throw new DataAccessException("request a gets without any condition");
}
final String tableName = AnnotationTools.getTableName(clazz, options);
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
// find the deleted field
@ -1102,12 +1085,12 @@ public class DataAccess {
query.append("DELETE FROM `");
query.append(tableName);
query.append("` ");
whereAppendQuery(query, tableName, condition, null, deletedFieldName);
condition.whereAppendQuery(query, tableName, null, deletedFieldName);
try {
LOGGER.debug("APPLY: {}", query.toString());
final PreparedStatement ps = entry.connection.prepareStatement(query.toString());
final CountInOut iii = new CountInOut(1);
whereInjectValue(ps, condition, iii);
condition.injectQuerry(ps, iii);
return ps.executeUpdate();
} finally {
entry.close();
@ -1115,11 +1098,18 @@ public class DataAccess {
}
}
private static <ID_TYPE> int deleteSoft(final Class<?> clazz, final ID_TYPE id, final QueryOptions options) throws Exception {
return deleteSoftWhere(clazz, getTableIdCondition(clazz, id), options);
private static <ID_TYPE> int deleteSoft(final Class<?> clazz, final ID_TYPE id, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
options.add(new Condition(getTableIdCondition(clazz, id)));
return deleteSoftWhere(clazz, options.getAllArray());
}
public static int deleteSoftWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
public static int deleteSoftWhere(final Class<?> clazz, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
Condition condition = options.get(Condition.class);
if (condition == null) {
throw new DataAccessException("request a gets without any condition");
}
final String tableName = AnnotationTools.getTableName(clazz, options);
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
/* String updateFieldName = null; if ("sqlite".equalsIgnoreCase(ConfigBaseVariable.getDBType())) { updateFieldName = AnnotationTools.getUpdatedFieldName(clazz); } */
@ -1134,12 +1124,12 @@ public class DataAccess {
query.append("`=true ");
/* The trigger work well, but the timestamp is store @ seconds... if (updateFieldName != null) { // done only in SQLite (the trigger does not work... query.append(", `");
* query.append(updateFieldName); query.append("`=DATE()"); } */
whereAppendQuery(query, tableName, condition, null, deletedFieldName);
condition.whereAppendQuery(query, tableName, null, deletedFieldName);
try {
LOGGER.debug("APPLY UPDATE: {}", query.toString());
final PreparedStatement ps = entry.connection.prepareStatement(query.toString());
final CountInOut iii = new CountInOut(1);
whereInjectValue(ps, condition, iii);
condition.injectQuerry(ps, iii);
return ps.executeUpdate();
} finally {
entry.close();
@ -1148,14 +1138,21 @@ public class DataAccess {
}
public static <ID_TYPE> int unsetDelete(final Class<?> clazz, final ID_TYPE id) throws Exception {
return unsetDeleteWhere(clazz, getTableIdCondition(clazz, id), null);
return unsetDeleteWhere(clazz, new Condition(getTableIdCondition(clazz, id)));
}
public static <ID_TYPE> int unsetDelete(final Class<?> clazz, final ID_TYPE id, final QueryOptions options) throws Exception {
return unsetDeleteWhere(clazz, getTableIdCondition(clazz, id), options);
public static <ID_TYPE> int unsetDelete(final Class<?> clazz, final ID_TYPE id, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
options.add(new Condition(getTableIdCondition(clazz, id)));
return unsetDeleteWhere(clazz, options.getAllArray());
}
public static int unsetDeleteWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
public static int unsetDeleteWhere(final Class<?> clazz, final QueryOption... option) throws Exception {
QueryOptions options = new QueryOptions(option);
Condition condition = options.get(Condition.class);
if (condition == null) {
throw new DataAccessException("request a gets without any condition");
}
final String tableName = AnnotationTools.getTableName(clazz, options);
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
if (deletedFieldName == null) {
@ -1170,11 +1167,11 @@ public class DataAccess {
query.append("`=false ");
// need to disable the deleted false because the model must be unselected to be updated.
options.add(QueryOptions.ACCESS_DELETED_ITEMS);
whereAppendQuery(query, tableName, condition, options, deletedFieldName);
condition.whereAppendQuery(query, tableName, options, deletedFieldName);
try {
final PreparedStatement ps = entry.connection.prepareStatement(query.toString());
final CountInOut iii = new CountInOut(1);
whereInjectValue(ps, condition, iii);
condition.injectQuerry(ps, iii);
return ps.executeUpdate();
} finally {
entry.close();

View File

@ -32,6 +32,10 @@ public class QueryOptions {
return this.options;
}
public QueryOption[] getAllArray() {
return this.options.toArray(new QueryOption[0]);
}
@SuppressWarnings("unchecked")
public <T> T get(final Class<T> type) {
for (final QueryOption elem : this.options) {

View File

@ -19,6 +19,7 @@ import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryInList;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.addOn.model.LinkTable;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
@ -85,7 +86,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
querrySelect.append(" (SELECT GROUP_CONCAT(");
querrySelect.append(tmpVariable);
querrySelect.append(".object2Id ");
if (ConfigBaseVariable.getDBType().equals("sqlite")) {
if ("sqlite".equals(ConfigBaseVariable.getDBType())) {
querrySelect.append(", ");
} else {
querrySelect.append("SEPARATOR ");
@ -104,7 +105,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
querrySelect.append(tmpVariable);
querrySelect.append(".");
querrySelect.append("object1Id ");
if (!ConfigBaseVariable.getDBType().equals("sqlite")) {
if (!"sqlite".equals(ConfigBaseVariable.getDBType())) {
querrySelect.append(" GROUP BY ");
querrySelect.append(tmpVariable);
querrySelect.append(".object1Id");
@ -169,7 +170,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
final List<Long> childs = new ArrayList<>(idList);
// TODO: update to have get with abstract types ....
@SuppressWarnings("unchecked")
final Object foreignData = DataAccess.getsWhere(decorators.targetEntity(), new QueryInList<>(idField, childs), null);
final Object foreignData = DataAccess.getsWhere(decorators.targetEntity(), new Condition(new QueryInList<>(idField, childs)));
if (foreignData == null) {
return;
}

View File

@ -5,6 +5,7 @@ import java.sql.PreparedStatement;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.QueryItem;
import org.kar.archidata.dataAccess.QueryOption;
import org.kar.archidata.dataAccess.QueryOptions;
/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
public class Condition extends QueryOption {
@ -25,4 +26,33 @@ public class Condition extends QueryOption {
this.condition.injectQuerry(ps, iii);
}
}
public void whereAppendQuery(final StringBuilder query, final String tableName, final QueryOptions options, final String deletedFieldName) {
boolean exclude_deleted = true;
if (options != null) {
exclude_deleted = !options.exist(AccessDeletedItems.class);
}
// Check if we have a condition to generate
if (this.condition == null) {
if (exclude_deleted && deletedFieldName != null) {
query.append(" WHERE ");
query.append(tableName);
query.append(".");
query.append(deletedFieldName);
query.append(" = false ");
}
return;
}
query.append(" WHERE (");
this.condition.generateQuerry(query, tableName);
query.append(") ");
if (exclude_deleted && deletedFieldName != null) {
query.append("AND ");
query.append(tableName);
query.append(".");
query.append(deletedFieldName);
query.append(" = false ");
}
}
}

View File

@ -0,0 +1,22 @@
package org.kar.archidata.dataAccess.options;
import java.util.List;
import org.kar.archidata.dataAccess.QueryOption;
/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
public class FilterValue extends QueryOption {
public final List<String> filterValue;
public FilterValue(final List<String> filterValue) {
this.filterValue = filterValue;
}
public FilterValue(final String... filterValue) {
this.filterValue = List.of(filterValue);
}
public List<String> getValues() {
return this.filterValue;
}
}