From 48ed646bb3afc89aac0769b6e06d39356739ae5b Mon Sep 17 00:00:00 2001 From: Rogiel Date: Thu, 29 Dec 2011 03:11:25 -0200 Subject: [PATCH] Implements count queries --- .../AbstractOrientDatabaseService.java | 73 +++++++++++++++++-- .../sql/AbstractSQLDatabaseService.java | 41 +++++++++++ 2 files changed, 107 insertions(+), 7 deletions(-) diff --git a/l2jserver2-common/src/main/java/com/l2jserver/service/database/orientdb/AbstractOrientDatabaseService.java b/l2jserver2-common/src/main/java/com/l2jserver/service/database/orientdb/AbstractOrientDatabaseService.java index 3555f0b8a..ccef28889 100644 --- a/l2jserver2-common/src/main/java/com/l2jserver/service/database/orientdb/AbstractOrientDatabaseService.java +++ b/l2jserver2-common/src/main/java/com/l2jserver/service/database/orientdb/AbstractOrientDatabaseService.java @@ -463,7 +463,7 @@ public abstract class AbstractOrientDatabaseService extends ((Model) object).setObjectDesire(ObjectDesire.NONE); } } - + /** * Tests if the object desire is not {@link ObjectDesire#TRANSIENT} * @@ -599,9 +599,9 @@ public abstract class AbstractOrientDatabaseService extends final DocumentDatabaseRow row = new DocumentDatabaseRow(); while (iterator.hasNext()) { final O object = iterator.next(); - if(testDesire(object)) + if (testDesire(object)) continue; - + row.setDocument(new ODocument(database, entity.getTableName())); mapper.insert(entity, object, row); @@ -687,7 +687,7 @@ public abstract class AbstractOrientDatabaseService extends final DocumentDatabaseRow row = new DocumentDatabaseRow(); while (iterator.hasNext()) { final O object = iterator.next(); - if(testDesire(object)) + if (testDesire(object)) continue; List documents = database @@ -698,7 +698,10 @@ public abstract class AbstractOrientDatabaseService extends @Override public boolean filter(OQueryContextNative record) { - return query(record, object).go(); + record = query(record, object); + if (record == null) + return true; + return record.go(); }; }); if (documents.size() < 1) @@ -777,7 +780,7 @@ public abstract class AbstractOrientDatabaseService extends int rows = 0; while (iterator.hasNext()) { final O object = iterator.next(); - if(testDesire(object)) + if (testDesire(object)) continue; List documents = database @@ -788,7 +791,10 @@ public abstract class AbstractOrientDatabaseService extends @Override public boolean filter(OQueryContextNative record) { - return query(record, object).go(); + record = query(record, object); + if (record == null) + return true; + return record.go(); }; }); for (final ODocument document : documents) { @@ -1029,4 +1035,57 @@ public abstract class AbstractOrientDatabaseService extends return results; } } + + /** + * An query implementation designed to count objects in the database + * + * @author Rogiel + * + * @param + * the query entity type + */ + public static abstract class CountQuery> + extends AbstractQuery { + /** + * The query entity + */ + protected final E entity; + + /** + * @param entity + * the entity type + */ + public CountQuery(E entity) { + this.entity = entity; + } + + @Override + public final Integer query(ODatabaseDocumentTx database, + DatabaseService service) { + List documents = database + .query(new ONativeSynchQuery(database, + entity.getTableName(), new OQueryContextNative()) { + private static final long serialVersionUID = 1L; + + @Override + public boolean filter(OQueryContextNative record) { + record = query(record); + if (record == null) + return true; + return record.go(); + }; + }); + return documents.size(); + } + + /** + * Performs the OrientDB document filtering. If all results are wanted, + * null should be returned. + * + * @param record + * the document record + * @return the record instance or null + */ + protected abstract OQueryContextNative query(OQueryContextNative record); + } } diff --git a/l2jserver2-common/src/main/java/com/l2jserver/service/database/sql/AbstractSQLDatabaseService.java b/l2jserver2-common/src/main/java/com/l2jserver/service/database/sql/AbstractSQLDatabaseService.java index 6395b8f4f..b5da03520 100644 --- a/l2jserver2-common/src/main/java/com/l2jserver/service/database/sql/AbstractSQLDatabaseService.java +++ b/l2jserver2-common/src/main/java/com/l2jserver/service/database/sql/AbstractSQLDatabaseService.java @@ -1065,4 +1065,45 @@ public abstract class AbstractSQLDatabaseService extends return objects; } } + + /** + * An query implementation designed to count objects in the database + * + * @author Rogiel + * + * @param + * the query entity type + */ + public static abstract class CountQuery> + extends AbstractQuery { + /** + * The query entity + */ + protected final E entity; + + /** + * @param entity + * the entity typeO + */ + public CountQuery(E entity) { + this.entity = entity; + } + + @Override + public final Integer query( + SQLQueryFactory, ?, ?, ?, ?, ?> factory, + DatabaseService database) { + final AbstractSQLQuery count = factory.query().from(entity); + query(count); + return (int) count.count(); + } + + /** + * Performs the query filtering + * + * @param q + * the query clause + */ + protected abstract void query(AbstractSQLQuery q); + } }