package ru.vyarus.guice.persist.orient.repository.command.ext.pagination; import com.orientechnologies.orient.core.command.OCommandRequest; import ru.vyarus.guice.persist.orient.db.util.Order; import ru.vyarus.guice.persist.orient.repository.command.core.spi.CommandExtension; import ru.vyarus.guice.persist.orient.repository.command.core.spi.CommandMethodDescriptor; import ru.vyarus.guice.persist.orient.repository.command.core.spi.SqlCommandDescriptor; import ru.vyarus.guice.persist.orient.repository.core.MethodDefinitionException; import javax.inject.Singleton; /** * {@link Limit} parameter annotation extension. * * @author Vyacheslav Rusakov * @since 06.02.2015 */ @Singleton // executed before default extensions, because it modifies query string @Order(-9) public class LimitParamExtension extends AbstractPaginationExtension<Limit> implements CommandExtension<CommandMethodDescriptor> { public static final String KEY = LimitParamExtension.class.getName(); @Override protected String getKey() { return KEY; } @Override public void amendCommandDescriptor(final SqlCommandDescriptor sql, final CommandMethodDescriptor descriptor, final Object instance, final Object... arguments) { final Number limit = getValue(descriptor, arguments); if (limit == null || limit.intValue() == 0) { return; } final String query = sql.command; MethodDefinitionException.check(query.toLowerCase().startsWith("select"), "@Limit may be used only for select queries"); sql.command = query + " LIMIT " + limit; } @Override public void amendCommand(final OCommandRequest query, final CommandMethodDescriptor descriptor, final Object instance, final Object... arguments) { // not needed } }