package org.nutz.dao.impl; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.nutz.dao.Cnd; import org.nutz.dao.Condition; import org.nutz.dao.Dao; import org.nutz.dao.FieldMatcher; import org.nutz.dao.Nesting; import org.nutz.dao.entity.Entity; import org.nutz.dao.jdbc.JdbcExpert; import org.nutz.dao.pager.Pager; import org.nutz.dao.sql.Pojo; import org.nutz.dao.sql.SqlType; import org.nutz.dao.util.Pojos; import org.nutz.lang.Lang; public class SimpleNesting implements Nesting { private static final String DISTINCT = "distinct"; public SimpleNesting(Dao dao) { this.expert = dao.getJdbcExpert(); holder = dao.getEntityHolder(); } protected JdbcExpert expert; protected EntityHolder holder; private Pojo pojo; @Override public Nesting select(String names, Class<?> clazz, Condition cnd) { make(clazz); distinct(pojo, names); pojo.append(Pojos.Items.queryEntityFields()); pojo.append(Pojos.Items.wrap("FROM")); pojo.append(Pojos.Items.entityViewName()); pojo.append(Pojos.Items.cnd(cnd)); if (cnd instanceof Cnd) { Pager pager = ((Cnd) cnd).getPager(); if (pager != null) { pojo.setPager(pager); } } expert.formatQuery(pojo); return this; } private Pojo make(Class<?> clazz) { Entity<?> en = holder.getEntity(clazz); pojo = Pojos.pojo(expert, en, SqlType.SELECT); pojo.setEntity(en); return pojo; } private Pojo distinct(Pojo pojo, String names) { if (!Lang.isEmpty(names) && names.length() != 0) { List<String> nameList = Arrays.asList(names.trim().split(",")); if (names.toLowerCase().contains(DISTINCT)) { pojo.append(Pojos.Items.wrap(DISTINCT)); // distinct只能作用一个在一个字段上 // 做一个排序处理,把DISTINCT的字段移到第一个 for (int i = 0; i < nameList.size(); ++i) { if (nameList.get(i).toLowerCase().contains(DISTINCT)) { Collections.swap(nameList, 0, i); // 为了让字段作为正则匹配到列,删除DINSTINCT nameList.set(0, nameList.get(0).toLowerCase().replace(DISTINCT, "").toLowerCase()); break; } } } StringBuilder sb = new StringBuilder(); for (String name : nameList) { sb.append(name.trim()); sb.append("|"); } sb.setLength(sb.length() - 1); pojo.getContext().setFieldMatcher(FieldMatcher.make(sb.toString(), null, true)); } return pojo; } @Override public String toString() { return pojo.toString(); } }