use of app.hongs.db.link.Loop in project HongsCORE by ihongs.
the class FetchCase method all.
/**
* 查询并获取全部结果
* @return
* @throws HongsException
*/
public List all() throws HongsException {
List<Map<String, Object>> ra = new ArrayList();
Map<String, Object> ro;
try (Loop rs = oll()) {
while ((ro = rs.next()) != null) {
ra.add(ro);
}
}
return ra;
}
use of app.hongs.db.link.Loop in project HongsCORE by ihongs.
the class FormAction method getForkList.
public void getForkList(Table ft, Table ut, List list, String pid, String pre) throws HongsException {
Loop units = pid == null ? ut.select("`" + ut.name + "`.`id`, `" + ut.name + "`.`name`").filter("`" + ut.name + "`.`pid` IS NULL").oll() : ut.select("`" + ut.name + "`.`id`, `" + ut.name + "`.`name`").filter("`" + ut.name + "`.`pid` = ?", pid).oll();
while (units.hasNext()) {
Map unit = units.next();
Loop forms = ft.select("`" + ft.name + "`.`id`, `" + ft.name + "`.`name`").filter("`" + ft.name + "`.unit_id", pid).oll();
while (forms.hasNext()) {
Map form = forms.next();
Map item = new HashMap();
item.put("__name__", /**/
form.get("id"));
item.put("__text__", pre + form.get("name"));
item.put("data-vk", "id");
item.put("data-tk", "name");
item.put("data-at", "centra/data/" + form.get("id") + "/search");
item.put("data-al", "centra/data/" + form.get("id") + "/list4fork.html");
list.add(item);
}
getForkList(ft, ut, list, (String) unit.get("id"), (String) unit.get("name") + "/");
}
}
use of app.hongs.db.link.Loop in project HongsCORE by ihongs.
the class DBFields method imports.
@Override
protected final void imports() throws HongsException {
fields = new LinkedHashMap();
Loop rs = db.query("SELECT * FROM `" + tn + "`", 0, 1);
try {
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
Map field = new HashMap();
field.put("type", md.getColumnType(i));
field.put("size", md.getPrecision(i));
field.put("scale", md.getScale(i));
field.put("unsigned", !md.isSigned(i));
field.put("required", md.isNullable(i) == ResultSetMetaData.columnNoNulls);
field.put("autoIncrement", md.isAutoIncrement(i));
field.put("caseSensitive", md.isCaseSensitive(i));
// 用处不大的的属性:
/*
field.put("currency", md.isCurrency(i));
field.put("readOnly", md.isReadOnly(i));
field.put("writable", md.isWritable(i));
field.put("searchable", md.isSearchable(i));
field.put("tableName", md.getTableName(i));
field.put("schemaName", md.getSchemaName(i));
field.put("catalogName", md.getCatalogName(i));
field.put("label", md.getColumnLable(i));
field.put("typeName", md.getColumnTypeName(i));
field.put("className", md.getColumnClassName(i));
field.put("displaySize", md.getColumnDisplaySize(i));
*/
this.fields.put(md.getColumnName(i), field);
}
} catch (SQLException ex) {
throw new HongsException(0x1071, ex);
} finally {
rs.close();
}
}
use of app.hongs.db.link.Loop in project HongsCORE by ihongs.
the class FetchMore method join.
/**
* 获取关联数据
* @param table 关联表
* @param caze 附加查询
* @param map 映射关系
* @param col 关联字段
* @throws app.hongs.HongsException
*/
public void join(Table table, FetchCase caze, Map<String, List> map, String col) throws HongsException {
if (map.isEmpty()) {
return;
}
DB db = table.db;
String name = table.name;
String tableName = table.tableName;
boolean multi = caze.getOption("ASSOC_MULTI", false);
boolean merge = caze.getOption("ASSOC_MERGE", false);
boolean fills = caze.getOption("ASSOC_FILLS", false);
if (null != caze.name && 0 != caze.name.length()) {
name = caze.name;
}
// 获取id及行号
Set ids = map.keySet();
if (ids.isEmpty()) {
// throw new HongsException(0x10c0, "Ids map is empty");
return;
}
// 识别字段别名
String rel = col;
if (table.getFields().containsKey(col)) {
col = "`" + name + "`.`" + col + "`";
} else {
Pattern pattern;
Matcher matcher;
do {
pattern = Pattern.compile("^(.+?)(?:\\s+AS)?\\s+`?(.+?)`?$", Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(col);
if (matcher.find()) {
col = matcher.group(1);
rel = matcher.group(2);
break;
}
pattern = Pattern.compile("^(.+?)\\.\\s*`?(.+?)`?$");
matcher = pattern.matcher(col);
if (matcher.find()) {
col = matcher.group(0);
rel = matcher.group(2);
break;
}
} while (false);
}
// 构建查询结构
caze.filter(col + " IN (?)", ids).from(tableName, name);
// 获取关联数据
Loop rs = db.queryMore(caze);
/**
* 根据之前的 ID=>行 关系以表名为键放入列表中
*/
String sid;
List lst;
Map row, sub;
// 登记已关联上的ID
Set idz = new HashSet();
// 暂存字段类型字典
Map tdz = rs.getTypeDict();
if (!multi) {
while ((sub = rs.next()) != null) {
sid = Synt.asString(sub.get(rel));
lst = map.get(sid);
idz.add(sid);
if (lst == null) {
// throw new HongsException(0x10c0, "Line nums is null");
continue;
}
Iterator it = lst.iterator();
while (it.hasNext()) {
row = (Map) it.next();
if (!merge) {
row.put(name, sub);
} else {
sub.putAll(row);
row.putAll(sub);
}
}
}
} else {
while ((sub = rs.next()) != null) {
sid = Synt.asString(sub.get(rel));
lst = map.get(sid);
idz.add(sid);
if (lst == null) {
// throw new HongsException(0x10c0, "Line nums is null");
continue;
}
Iterator it = lst.iterator();
while (it.hasNext()) {
row = (Map) it.next();
if (row.containsKey(name)) {
((List) row.get(name)).add(sub);
} else {
List lzt = new ArrayList();
row.put(name, lzt);
lzt.add(sub);
}
}
}
}
if (!fills) {
return;
}
if (!multi && merge) {
Set<String> padSet = tdz.keySet();
for (Map.Entry<String, List> et : map.entrySet()) {
String colKey = et.getKey();
if (idz.contains(colKey)) {
continue;
}
List<Map> mapLst = et.getValue();
for (Map mapRow : mapLst) {
for (String k : padSet) {
if (!mapRow.containsKey(k)) {
mapRow.put(k, null);
}
}
}
}
} else {
Object padDat = !multi ? new HashMap() : new ArrayList();
for (Map.Entry<String, List> et : map.entrySet()) {
String colKey = et.getKey();
if (idz.contains(colKey)) {
continue;
}
List<Map> mapLst = et.getValue();
for (Map mapRow : mapLst) {
if (!mapRow.containsKey(name)) {
mapRow.put(name, padDat);
}
}
}
}
}
Aggregations