String[] getTableNames(String dbName) { ArrayList<String> tableNames = new ArrayList<>(); for (MetaModel metaModel : metaModelsByTableName.values()) { if (metaModel.getDbName().equals(dbName)) tableNames.add(metaModel.getTableName()); } return tableNames.toArray(new String[tableNames.size()]); }
public MetaModel getMetaModel(Class<? extends Model> modelClass) { String dbName = MetaModel.getDbName(modelClass); init(dbName); return metaModels.getMetaModel(modelClass); }
protected String toJSON() { List models = new ArrayList(); metaModelsByTableName.values().forEach(metaModel -> { List associations = new ArrayList(); metaModel.getAssociations().forEach(association -> associations.add(association.toMap())); models.add(map( MODEL_CLASS, metaModel.getModelClass().getName(), DB_TYPE, metaModel.getDbType(), DB_NAME, metaModel.getDbName(), COLUMN_METADATA, metaModel.getColumnMetadata(), ASSOCIATIONS, associations )); }); return JsonHelper.toJsonString(models,false); }
protected static Set<Class<? extends Model>> getModelsForDb(String dbName) throws ClassNotFoundException { Set<String> modelClassNames = getModelMap().get(dbName); Set<Class<? extends Model>> classSet = new HashSet<>(); if (modelClassNames != null) { for (String className : modelClassNames) { Class modelClass = Class.forName(className); if (!modelClass.equals(Model.class) && Model.class.isAssignableFrom(modelClass)) { String realDbName = MetaModel.getDbName(modelClass); if (realDbName.equals(dbName)) { classSet.add(modelClass); } else { throw new InitException("invalid database association for the " + className + ". Real database name: " + realDbName); } } else { throw new InitException("invalid class in the models list: " + className); } } } if (classSet.isEmpty()){ throw new InitException("you are trying to work with models, but no models are found. Maybe you have " + "no models in project, or you did not instrument the models. It is expected that you have " + "a file activejdbc_models.properties on classpath"); } return classSet; } //
private static int update(MetaModel metaModel, String updates, String conditions, Object... params) { StringBuilder sql = new StringBuilder().append("UPDATE ").append(metaModel.getTableName()).append(" SET "); Object[] allParams; if (metaModel.hasAttribute("updated_at")) { sql.append("updated_at = ?, "); allParams = new Object[params.length + 1]; allParams[0] = new Timestamp(System.currentTimeMillis()); System.arraycopy(params, 0, allParams, 1, params.length); } else { allParams = params; } sql.append(updates); if (!blank(conditions)) { sql.append(" WHERE ").append(conditions); } int count = new DB(metaModel.getDbName()).exec(sql.toString(), allParams); if (metaModel.cached()) { Registry.cacheManager().purgeTableCache(metaModel); } return count; }
protected String getTableName(Class<? extends Model> modelClass) { init(MetaModel.getDbName(modelClass)); String tableName = metaModels.getTableName(modelClass); if (tableName == null) { throw new DBException("failed to find metamodel for " + modelClass + ". Are you sure that a corresponding table exists in DB?"); } return tableName; }
private Long doCount() { Object count = new DB(metaModel.getDbName()).firstCell(countQueryFull, params); return count == null? 0: Convert.toLong(count); }
@Override public void validate(Model model) { MetaModel metaModel = metaModelOf(model.getClass()); if (new DB(metaModel.getDbName()).count(metaModel.getTableName(), attribute + " = ?", model.get(attribute)) > 0) { model.addValidator(this, attribute); } } }
/** * Deletes all records from a join table related to this model. * * @param association association to another table. */ private void deleteManyToManyLinks(Many2ManyAssociation association){ String join = association.getJoin(); String sourceFK = association.getSourceFkName(); new DB(metaModelLocal.getDbName()).exec("DELETE FROM " + join + " WHERE " + sourceFK + " = ?", getId()); }
/** * Returns true if record corresponding to the id of this instance exists in the DB. * * @return true if corresponding record exists in DB, false if it does not. */ public boolean exists(){ return null != new DB(metaModelLocal.getDbName()).firstCell(metaModelLocal.getDialect().selectExists(metaModelLocal), getId()); }
public static boolean exists(Class<? extends Model> clazz, Object id) { MetaModel metaModel = metaModelOf(clazz); return null != new DB(metaModel.getDbName()).firstCell(metaModel.getDialect().selectExists(metaModel), id); }
private void processManyToMany(Many2ManyAssociation association) { if(delegate.isEmpty()){//no need to process other if no models selected. return; } final MetaModel childMetaModel = metaModelOf(association.getTargetClass()); final Map<Object, List<Model>> childrenByParentId = new HashMap<>(); List<Object> ids = collect(metaModel.getIdName()); List<Map> childResults = new DB(childMetaModel.getDbName()).findAll(childMetaModel.getDialect().selectManyToManyAssociation( association, "the_parent_record_id", ids.size()), ids.toArray()); for(Map res: childResults){ Model child = ModelDelegate.instance(res, childMetaModel); Object parentId = res.get("the_parent_record_id"); if(childrenByParentId.get(parentId) == null){ childrenByParentId.put(parentId, new SuperLazyList<>()); } childrenByParentId.get(parentId).add(child); } for(T parent : delegate){ List<Model> children = childrenByParentId.get(parent.getId()); if (children != null) { parent.setChildren(childMetaModel.getModelClass(), children); } else { parent.setChildren(childMetaModel.getModelClass(), new SuperLazyList<>()); } } }
public static int delete(Class<? extends Model> clazz, String query, Object... params) { MetaModel metaModel = metaModelOf(clazz); //TODO: refactor this: int count = (params == null || params.length == 0) ? new DB(metaModel.getDbName()).exec("DELETE FROM " + metaModel.getTableName() + " WHERE " + query) : new DB(metaModel.getDbName()).exec("DELETE FROM " + metaModel.getTableName() + " WHERE " + query, params); if (metaModel.cached()) { Registry.cacheManager().purgeTableCache(metaModel); } purgeEdges(metaModel); return count; }
public static <T extends Model, M extends T> void findWith(final Class<M> clazz, final ModelListener<T> listener, String query, Object... params) { long start = System.currentTimeMillis(); final MetaModel metaModel = metaModelOf(clazz); String sql = metaModel.getDialect().selectStar(metaModel.getTableName(), query); new DB(metaModel.getDbName()).find(sql, params).with(new RowListenerAdapter() { @Override public void onNext(Map<String, Object> row) { listener.onModel(instance(row, metaModel, clazz)); } }); LogFilter.logQuery(LOGGER, sql, null, start); }
/** * Deletes immediate polymorphic children */ private void deletePolymorphicChildrenShallow(OneToManyPolymorphicAssociation association){ String targetTable = metaModelOf(association.getTargetClass()).getTableName(); String parentType = association.getTypeLabel(); new DB(metaModelLocal.getDbName()).exec("DELETE FROM " + targetTable + " WHERE parent_id = ? AND parent_type = ?", getId(), parentType); }
/** * Deletes immediate children. */ private void deleteOne2ManyChildrenShallow(OneToManyAssociation association){ String targetTable = metaModelOf(association.getTargetClass()).getTableName(); new DB(metaModelLocal.getDbName()).exec("DELETE FROM " + targetTable + " WHERE " + association.getFkName() + " = ?", getId()); }
public static int deleteAll(Class<? extends Model> clazz) { MetaModel metaModel = metaModelOf(clazz); int count = new DB(metaModel.getDbName()).exec("DELETE FROM " + metaModel.getTableName()); if (metaModel.cached()) { Registry.cacheManager().purgeTableCache(metaModel); } purgeEdges(metaModel); return count; }
public static Long count(Class<? extends Model> clazz) { MetaModel metaModel = metaModelOf(clazz); String sql = metaModel.getDialect().selectCount(metaModel.getTableName()); Long result; if (metaModel.cached()) { result = (Long) QueryCache.instance().getItem(metaModel.getTableName(), sql, null); if (result == null) { result = Convert.toLong(new DB(metaModel.getDbName()).firstCell(sql)); QueryCache.instance().addItem(metaModel.getTableName(), sql, null, result); }else { LogFilter.logQuery(LOGGER, sql, new Object[]{}, System.currentTimeMillis(), true); } } else { result = Convert.toLong(new DB(metaModel.getDbName()).firstCell(sql)); } return result; }
@Override protected void hydrate() { if (hydrated()) { return; } String sql= toSql(false); if(metaModel.cached()){ List<T> cached = (List<T>) QueryCache.instance().getItem(metaModel.getTableName(), sql, params); if(cached != null){ delegate = cached; LogFilter.logQuery(LOGGER, sql, params, System.currentTimeMillis(), true); return; } } delegate = new ArrayList<>(); long start = System.currentTimeMillis(); new DB(metaModel.getDbName()).find(sql, params).with(new RowListenerAdapter() { @Override public void onNext(Map<String, Object> map) { delegate.add(ModelDelegate.<T>instance(map, metaModel)); } }); LogFilter.logQuery(LOGGER, sql, params, start, false); if(metaModel.cached()){ delegate = Collections.unmodifiableList(delegate); QueryCache.instance().addItem(metaModel.getTableName(), sql, params, delegate); } processIncludes(); }
public static Long count(Class<? extends Model> clazz, String query, Object... params) { MetaModel metaModel = metaModelOf(clazz); String sql = metaModel.getDialect().selectCount(metaModel.getTableName(), query); Long result; if (metaModel.cached()) { result = (Long) QueryCache.instance().getItem(metaModel.getTableName(), sql, params); if (result == null) { result = Convert.toLong(new DB(metaModel.getDbName()).firstCell(sql, params)); QueryCache.instance().addItem(metaModel.getTableName(), sql, params, result); } } else { result = Convert.toLong(new DB(metaModel.getDbName()).firstCell(sql, params)); } return result; }