String getTableName(Class<? extends Model> modelClass) { return metaModelsByClassName.containsKey(modelClass.getName())? metaModelsByClassName.get(modelClass.getName()).getTableName():null; }
/** * FK name is a foreign key name used in relationships as a foreign key column in a child table (table represented by this * instance is a parent table). * The FK name is derived using {@link org.javalite.common.Inflector}: It is a singular version of this table name plus "_id". * * @return foreign key name used in relationships as a foreign key column in a child table. */ public String getFKName() { return singularize(getTableName()).toLowerCase() + "_id"; }
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()]); }
@Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Model: ").append(getClass().getName()) .append(", table: '").append(metaModelLocal.getTableName()) .append("', attributes: ").append(attributes); if (cachedParents.size() > 0) { sb.append(", parent: ").append(cachedParents); } if (cachedChildren.size() > 0) { sb.append(", children: ").append(cachedChildren); } return sb.toString(); }
/** * Retrieves all attribute names. * * @return all attribute names. */ protected Set<String> getAttributeNames() { if(columnMetadata == null || columnMetadata.isEmpty()) throw new InitException("Failed to find table: " + getTableName()); return Collections.unmodifiableSet(columnMetadata.keySet()); }
/** * Provides column metadata map, keyed by attribute names. * Table columns correspond to ActiveJDBC model attributes. * * @return Provides column metadata map, keyed by attribute names. */ public Map<String, ColumnMetadata> getColumnMetadata() { if(columnMetadata == null || columnMetadata.isEmpty()) throw new InitException("Failed to find table: " + getTableName()); return Collections.unmodifiableMap(columnMetadata); }
void addMetaModel(MetaModel mm, Class<? extends Model> modelClass) { Object o = metaModelsByClassName.put(modelClass.getName(), mm); if (o != null) { LogFilter.log(LOGGER, LogLevel.WARNING, "Double-register: {}: {}", modelClass, o); } o = metaModelsByTableName.put(mm.getTableName(), mm); many2ManyAssociations.addAll(mm.getManyToManyAssociations(Collections.<Association>emptyList())); if (o != null) { LogFilter.log(LOGGER, LogLevel.WARNING, "Double-register: {}: {}", mm.getTableName(), o); } }
/** * This method purges (removes) all caches associated with a table, if caching is enabled and * a corresponding model is marked cached. * * @param metaModel meta-model whose caches are to purge. */ public void purgeTableCache(MetaModel metaModel) { flush(new CacheEvent(metaModel.getTableName(), getClass().getName())); }
@Override public String selectManyToManyAssociation(Many2ManyAssociation association, String sourceFkColumnName, int questionsCount) { String targetTable = metaModelOf(association.getTargetClass()).getTableName(); StringBuilder query = new StringBuilder().append("SELECT ").append(targetTable).append(".*, t.") .append(association.getSourceFkName()).append(" AS ").append(sourceFkColumnName).append(" FROM ") .append(targetTable).append(" INNER JOIN ").append(association.getJoin()).append(" t ON ") .append(targetTable).append('.').append(association.getTargetPk()).append(" = t.") .append(association.getTargetFkName()).append(" WHERE t.").append(association.getSourceFkName()) .append(" IN ("); appendQuestions(query, questionsCount); query.append(')'); return query.toString(); }
/** * This method purges (removes) all caches associated with a table, if caching is enabled and * a corresponding model is marked cached. * * @param metaModel meta-model whose caches are to purge. */ public void purgeTableCache(MetaModel metaModel) { if(enabled && metaModel.cached()){ cacheManager.flush(new CacheEvent(metaModel.getTableName(), getClass().getName())); } }
@Override public String selectExists(MetaModel metaModel) { return "SELECT " + metaModel.getIdName() + " FROM " + metaModel.getTableName() + " WHERE " + metaModel.getIdName() + " = ?"; }
/** * Use {@link #purgeTableCache(MetaModel)} whenever you can. * * @param tableName name of table whose caches to purge. */ public void purgeTableCache(String tableName) { if (enabled) { MetaModel mm = Registry.instance().getMetaModel(tableName); if(mm != null && mm.cached()){ cacheManager.flush(new CacheEvent(mm.getTableName(), getClass().getName())); } } }
@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); } } }
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); }
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; }
/** * 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()); }
/** * 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); }
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; }
static void purgeEdges(MetaModel metaModel) { //this is to eliminate side effects of cache on associations. //TODO: Need to write tests for cases; // 1. One to many relationship. Parent and child are cached. // When a new child inserted, the parent.getAll(Child.class) should see that // 2. Many to many. When a new join inserted, updated or deleted, the one.getAll(Other.class) should see the difference. //Purge associated targets List<Association> associations = metaModel.getAssociations(); for(Association association: associations){ Registry.cacheManager().purgeTableCache(metaModelOf(association.getTargetClass())); } //Purge edges in case this model represents a join List<String> edges = Registry.instance().getEdges(metaModel.getTableName()); for(String edge: edges){ Registry.cacheManager().purgeTableCache(edge); } }