/* * Copyright 2014 mango.jfaster.org * * The Mango Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.jfaster.mango.operator.cache; import org.jfaster.mango.binding.BoundSql; import org.jfaster.mango.datasource.DataSourceFactoryGroup; import org.jfaster.mango.datasource.SimpleDataSourceFactory; import org.jfaster.mango.descriptor.MethodDescriptor; import org.jfaster.mango.descriptor.ParameterDescriptor; import org.jfaster.mango.descriptor.ReturnDescriptor; import org.jfaster.mango.interceptor.InterceptorChain; import org.jfaster.mango.operator.Config; import org.jfaster.mango.operator.Operator; import org.jfaster.mango.operator.OperatorFactory; import org.jfaster.mango.stat.MetaStat; import org.jfaster.mango.stat.OneExecuteStat; import org.jfaster.mango.support.*; import org.jfaster.mango.support.model4table.User; import org.jfaster.mango.util.reflect.TypeToken; import org.junit.Test; import javax.sql.DataSource; import java.lang.annotation.Annotation; import java.util.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; /** * @author ash */ public class CacheableUpdateOperatorTest { @Test public void testUpdate() throws Exception { TypeToken<User> pt = TypeToken.of(User.class); TypeToken<Integer> rt = TypeToken.of(int.class); String srcSql = "update user set name=:1.name where id=:1.id"; Operator operator = getOperator(pt, rt, srcSql, new CacheHandlerAdapter() { @Override public void delete(String key, Class<?> daoClass) { assertThat(key, equalTo("user_100")); } }, new MockCacheBy("id")); operator.setJdbcOperations(new JdbcOperationsAdapter() { @Override public int update(DataSource ds, BoundSql boundSql) { String sql = boundSql.getSql(); Object[] args = boundSql.getArgs().toArray(); String descSql = "update user set name=? where id=?"; assertThat(sql, equalTo(descSql)); assertThat(args.length, equalTo(2)); assertThat(args[0], equalTo((Object) "ash")); assertThat(args[1], equalTo((Object) 100)); return 1; } }); User user = new User(); user.setId(100); user.setName("ash"); OneExecuteStat stat = OneExecuteStat.create(); operator.execute(new Object[]{user}, stat); assertThat(stat.getCacheDeleteSuccessCount(), equalTo(1L)); } @Test public void testUpdateWithIn() throws Exception { TypeToken<List<Integer>> pt = new TypeToken<List<Integer>>() { }; TypeToken<Integer> rt = TypeToken.of(int.class); String srcSql = "update user set name=ash where id in (:1)"; Operator operator = getOperator(pt, rt, srcSql, new CacheHandlerAdapter() { @Override public void batchDelete(Set<String> keys, Class<?> daoClass) { Set<String> set = new HashSet<String>(); set.add("user_100"); set.add("user_200"); assertThat(keys, equalTo(set)); } }, new MockCacheBy("")); operator.setJdbcOperations(new JdbcOperationsAdapter() { @Override public int update(DataSource ds, BoundSql boundSql) { String sql = boundSql.getSql(); Object[] args = boundSql.getArgs().toArray(); String descSql = "update user set name=ash where id in (?,?)"; assertThat(sql, equalTo(descSql)); assertThat(args.length, equalTo(2)); assertThat(args[0], equalTo((Object) 100)); assertThat(args[1], equalTo((Object) 200)); return 1; } }); List<Integer> ids = Arrays.asList(100, 200); OneExecuteStat stat = OneExecuteStat.create(); operator.execute(new Object[]{ids}, stat); assertThat(stat.getCacheBatchDeleteSuccessCount(), equalTo(1L)); } private Operator getOperator(TypeToken<?> pt, TypeToken<?> rt, String srcSql, CacheHandler ch, MockCacheBy cacheBy) throws Exception { List<Annotation> pAnnos = new ArrayList<Annotation>(); pAnnos.add(cacheBy); ParameterDescriptor p = ParameterDescriptor.create(0, pt.getType(), pAnnos, "1"); List<ParameterDescriptor> pds = Arrays.asList(p); List<Annotation> methodAnnos = new ArrayList<Annotation>(); methodAnnos.add(new MockDB()); methodAnnos.add(new MockCache("user", Day.class)); methodAnnos.add(new MockSQL(srcSql)); ReturnDescriptor rd = ReturnDescriptor.create(rt.getType(), methodAnnos); MethodDescriptor md = MethodDescriptor.create(null, null, rd, pds); DataSourceFactoryGroup group = new DataSourceFactoryGroup(); group.addDataSourceFactory(new SimpleDataSourceFactory(DataSourceConfig.getDataSource())); OperatorFactory factory = new OperatorFactory(group, ch, new InterceptorChain(), new Config()); Operator operator = factory.getOperator(md, MetaStat.create()); return operator; } }