Skip to content

Commit

Permalink
0004776: Added support for lazily loading nodes (#136)
Browse files Browse the repository at this point in the history
  • Loading branch information
evan-miller-jumpmind committed Jan 19, 2021
1 parent 9e79e21 commit d1ef2ab
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 1 deletion.
Expand Up @@ -121,6 +121,11 @@ public void ignoreNodeChannelForExternalId(boolean ignore, String channelId,
public List<Node> findAllNodes();

public Map<String, Node> findAllNodesAsMap();

public List<Node> findFilteredNodesWithLimit(int offset, int limit, List<FilterCriterion> filter,
String orderColumn, String orderDirection);

public int countFilteredNodes(List<FilterCriterion> filter);

public List<Node> findNodesToPull();

Expand Down
Expand Up @@ -32,6 +32,7 @@
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.jumpmind.db.sql.ISqlReadCursor;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.ISqlTransaction;
import org.jumpmind.db.sql.Row;
Expand All @@ -49,8 +50,10 @@
import org.jumpmind.symmetric.model.NodeSecurity;
import org.jumpmind.symmetric.model.NodeStatus;
import org.jumpmind.symmetric.security.INodePasswordFilter;
import org.jumpmind.symmetric.service.FilterCriterion;
import org.jumpmind.symmetric.service.IExtensionService;
import org.jumpmind.symmetric.service.INodeService;
import org.jumpmind.symmetric.service.FilterCriterion.FilterOption;
import org.jumpmind.symmetric.util.DefaultNodeIdCreator;
import org.jumpmind.util.AppUtils;

Expand Down Expand Up @@ -426,6 +429,108 @@ public Map<String, Node> findAllNodesAsMap() {
}
return nodeMap;
}

public List<Node> findFilteredNodesWithLimit(int offset, int limit, List<FilterCriterion> filter,
String orderColumn, String orderDirection) {
String where = filter != null ? buildWhere(filter) : null;
Map<String, Object> params = filter != null ? buildParams(filter) : new HashMap<String, Object>();
String orderBy = buildOrderBy(orderColumn, orderDirection);
String sql = getSql("selectNodePrefixSql", where, orderBy);

List<Node> nodeList;

if (platform.supportsLimitOffset()) {
sql = platform.massageForLimitOffset(sql, limit, offset);
nodeList = sqlTemplateDirty.query(sql, new NodeRowMapper(), params);
} else {
ISqlReadCursor<Node> cursor = sqlTemplateDirty.queryForCursor(sql, new NodeRowMapper(), params);
try {
Node next = null;
nodeList = new ArrayList<Node>();
int rowCount = 0;
do {
next = cursor.next();
if (next != null) {
if (offset <= rowCount && rowCount < limit + offset) {
nodeList.add(next);
}
rowCount++;
}

if (rowCount >= limit + offset) {
break;
}
} while (next != null);
} finally {
if (cursor != null) {
cursor.close();
}
}
}

return nodeList;
}

public int countFilteredNodes(List<FilterCriterion> filter) {
String where = filter != null ? buildWhere(filter) : null;
Map<String, Object> params = filter != null ? buildParams(filter) : new HashMap<String, Object>();
String sql = getSql("selectNodePrefixSql", where);
sql = "select count(node_id) from (" + sql + ");";
int size = sqlTemplate.queryForInt(sql, params);
return size;
}

protected String buildWhere(List<FilterCriterion> filter) {
StringBuilder where = new StringBuilder();
boolean needsAnd = false;
int id = 0;

for (FilterCriterion criterion : filter) {
if (needsAnd) {
where.append(" and ");
} else {
needsAnd = true;
}

FilterOption option = criterion.getOption();
String optionSql = option.toSql();
String prefix = criterion.getPropertyId().replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase() + " " + optionSql;
where.append(prefix + " :" + id++);
}

if (where.length() > 0) {
where.insert(0, " where ");
}
return where.toString();
}

protected Map<String, Object> buildParams(List<FilterCriterion> filter) {
Map<String, Object> params = new HashMap<String, Object>();

int id = 0;
for (FilterCriterion criterion : filter) {
Object value = criterion.getValues().get(0);
if (criterion.getOption().equals(FilterOption.CONTAINS)) {
value = "%" + value + "%";
}
params.put(String.valueOf(id++), value);
}

return params;
}

protected String buildOrderBy(String orderColumn, String orderDirection) {
String orderBy = " order by ";
if (orderColumn == null) {
orderBy += "node_id desc";
} else {
orderBy += orderColumn.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();
if (orderDirection.equals("DESCENDING")) {
orderBy += " desc";
}
}
return orderBy;
}

public NetworkedNode getRootNetworkedNode() {
Map<String, Node> nodes = findAllNodesAsMap();
Expand Down
Expand Up @@ -37,7 +37,8 @@
import org.jumpmind.symmetric.model.NodeHost;
import org.jumpmind.symmetric.model.NodeSecurity;
import org.jumpmind.symmetric.model.NodeStatus;
import org.jumpmind.symmetric.security.INodePasswordFilter;
import org.jumpmind.symmetric.security.INodePasswordFilter;
import org.jumpmind.symmetric.service.FilterCriterion;
import org.jumpmind.symmetric.service.INodeService;

public class MockNodeService implements INodeService {
Expand Down Expand Up @@ -155,6 +156,17 @@ public Node findNode(String nodeId) {
public Node findNodeInCacheOnly(String id) {
return null;
}

@Override
public List<Node> findFilteredNodesWithLimit(int offset, int limit, List<FilterCriterion> filter,
String orderColumn, String orderDirection) {
return null;
}

@Override
public int countFilteredNodes(List<FilterCriterion> filter) {
return 0;
}

public Node findNodeByExternalId(String nodeGroupId, String externalId) {
return null;
Expand Down

0 comments on commit d1ef2ab

Please sign in to comment.