use of com.revolsys.record.query.Condition in project com.revolsys.open by revolsys.
the class QueryWhereConditionField method toQueryValue.
@SuppressWarnings("unchecked")
private <V extends QueryValue> V toQueryValue(final ValueNode expression) {
if (expression instanceof BetweenOperatorNode) {
final BetweenOperatorNode betweenExpression = (BetweenOperatorNode) expression;
final ValueNode leftValueNode = betweenExpression.getLeftOperand();
final ValueNodeList rightOperandList = betweenExpression.getRightOperandList();
final ValueNode betweenExpressionStart = rightOperandList.get(0);
final ValueNode betweenExpressionEnd = rightOperandList.get(1);
if (!(leftValueNode instanceof ColumnReference)) {
setInvalidMessage("Between operator must use a column name not: " + leftValueNode);
return null;
}
if (!(betweenExpressionStart instanceof NumericConstantNode)) {
setInvalidMessage("Between min value must be a number not: " + betweenExpressionStart);
return null;
}
if (!(betweenExpressionEnd instanceof NumericConstantNode)) {
setInvalidMessage("Between max value must be a number not: " + betweenExpressionEnd);
return null;
}
final Column column = toQueryValue(leftValueNode);
final Value min = toQueryValue(betweenExpressionStart);
final Value max = toQueryValue(betweenExpressionEnd);
final FieldDefinition fieldDefinition = this.recordDefinition.getField(column.getName());
min.convert(fieldDefinition);
max.convert(fieldDefinition);
return (V) new Between(column, min, max);
} else if (expression instanceof BinaryLogicalOperatorNode) {
final BinaryLogicalOperatorNode binaryOperatorNode = (BinaryLogicalOperatorNode) expression;
final String operator = binaryOperatorNode.getOperator().toUpperCase();
final ValueNode leftValueNode = binaryOperatorNode.getLeftOperand();
final ValueNode rightValueNode = binaryOperatorNode.getRightOperand();
final QueryValue leftValue = toQueryValue(leftValueNode);
if (leftValue instanceof Condition) {
final Condition leftCondition = (Condition) leftValue;
final QueryValue rightValue = toQueryValue(rightValueNode);
if (rightValue instanceof Condition) {
final Condition rightCondition = (Condition) rightValue;
if ("AND".equals(operator)) {
return (V) new And(leftCondition, rightCondition);
} else if ("OR".equals(operator)) {
return (V) new Or(leftCondition, rightCondition);
} else {
setInvalidMessage("Binary logical operator " + operator + " not supported.");
return null;
}
} else {
setInvalidMessage("Right side of " + operator + " must be a condition (e.g. column_name = 'value') not: " + rightValue);
return null;
}
} else {
setInvalidMessage("Left side of " + operator + " must be a condition (e.g. column_name = 'value') not: " + leftValue);
return null;
}
} else if (expression instanceof BinaryOperatorNode) {
final BinaryOperatorNode binaryOperatorNode = (BinaryOperatorNode) expression;
final String operator = binaryOperatorNode.getOperator();
final ValueNode leftValueNode = binaryOperatorNode.getLeftOperand();
final ValueNode rightValueNode = binaryOperatorNode.getRightOperand();
if (QueryValue.SUPPORTED_BINARY_OPERATORS.contains(operator.toUpperCase())) {
final QueryValue leftCondition = toQueryValue(leftValueNode);
QueryValue rightCondition = toQueryValue(rightValueNode);
if (leftCondition instanceof Column) {
if (rightCondition instanceof Value) {
final Object value = ((Value) rightCondition).getValue();
if (value == null) {
setInvalidMessage("Values can't be null for " + operator + " use IS NULL or IS NOT NULL instead.");
} else {
final Column column = (Column) leftCondition;
final String name = column.getName();
final FieldDefinition fieldDefinition = this.recordDefinition.getField(name);
final CodeTable codeTable = this.recordDefinition.getCodeTableByFieldName(name);
if (codeTable == null || fieldDefinition == this.recordDefinition.getIdField()) {
try {
final Object convertedValue = fieldDefinition.toFieldValueException(value);
if (convertedValue == null) {
setInvalidMessage("Values can't be null for " + operator + " use IS NULL or IS NOT NULL instead.");
return null;
} else {
rightCondition = new Value(fieldDefinition, convertedValue);
}
} catch (final Throwable t) {
setInvalidMessage(name + "='" + value + "' is not a valid " + fieldDefinition.getDataType().getValidationName());
}
} else {
Object id;
if (value instanceof String) {
final String string = (String) value;
final String[] values = string.split(":");
id = codeTable.getIdentifier((Object[]) values);
} else {
id = codeTable.getIdentifier(value);
}
if (id == null) {
setInvalidMessage(name + "='" + value + "' could not be found in the code table " + codeTable.getName());
} else {
rightCondition = new Value(fieldDefinition, id);
}
}
}
}
}
if (expression instanceof BinaryArithmeticOperatorNode) {
final QueryValue arithmaticCondition = Q.arithmatic(leftCondition, operator, rightCondition);
return (V) arithmaticCondition;
} else {
final Condition binaryCondition = Q.binary(leftCondition, operator, rightCondition);
return (V) binaryCondition;
}
} else {
setInvalidMessage("Unsupported binary operator " + operator);
}
} else if (expression instanceof ColumnReference) {
final ColumnReference column = (ColumnReference) expression;
String columnName = column.getColumnName();
columnName = columnName.replaceAll("\"", "");
final FieldDefinition fieldDefinition = this.recordDefinition.getField(columnName);
if (fieldDefinition == null) {
setInvalidMessage("Invalid field name " + columnName);
} else {
return (V) new Column(fieldDefinition);
}
} else if (expression instanceof LikeEscapeOperatorNode) {
final LikeEscapeOperatorNode likeEscapeOperatorNode = (LikeEscapeOperatorNode) expression;
final ValueNode leftValueNode = likeEscapeOperatorNode.getReceiver();
final ValueNode rightValueNode = likeEscapeOperatorNode.getLeftOperand();
final QueryValue leftCondition = toQueryValue(leftValueNode);
final QueryValue rightCondition = toQueryValue(rightValueNode);
return (V) new ILike(leftCondition, rightCondition);
} else if (expression instanceof NotNode) {
final NotNode notNode = (NotNode) expression;
final ValueNode operand = notNode.getOperand();
final Condition condition = toQueryValue(operand);
return (V) new Not(condition);
} else if (expression instanceof InListOperatorNode) {
final InListOperatorNode inListOperatorNode = (InListOperatorNode) expression;
final ValueNode leftOperand = inListOperatorNode.getLeftOperand();
final QueryValue leftCondition = toQueryValue(leftOperand);
final List<QueryValue> conditions = new ArrayList<>();
final RowConstructorNode itemsList = inListOperatorNode.getRightOperandList();
for (final ValueNode itemValueNode : itemsList.getNodeList()) {
final QueryValue itemCondition = toQueryValue(itemValueNode);
conditions.add(itemCondition);
}
return (V) new In(leftCondition, new CollectionValue(conditions));
} else if (expression instanceof IsNullNode) {
final IsNullNode isNullNode = (IsNullNode) expression;
final ValueNode operand = isNullNode.getOperand();
final QueryValue value = toQueryValue(operand);
if (isNullNode.getNodeType() == NodeTypes.IS_NOT_NULL_NODE) {
return (V) new IsNotNull(value);
} else {
return (V) new IsNull(value);
}
// } else if (expression instanceof Parenthesis) {
// final Parenthesis parenthesis = (Parenthesis)expression;
// final ValueNode parenthesisValueNode = parenthesis.getExpression();
// final Condition condition = toCondition(parenthesisExpression);
// final ParenthesisCondition parenthesisCondition = new
// ParenthesisCondition(
// condition);
// if (parenthesis.isNot()) {
// return (V)Q.not(parenthesisCondition);
// } else {
// return (V)parenthesisCondition;
// }
} else if (expression instanceof RowConstructorNode) {
final RowConstructorNode rowConstructorNode = (RowConstructorNode) expression;
final ValueNodeList values = rowConstructorNode.getNodeList();
final ValueNode valueNode = values.get(0);
return (V) toQueryValue(valueNode);
} else if (expression instanceof UserTypeConstantNode) {
final UserTypeConstantNode constant = (UserTypeConstantNode) expression;
final Object objectValue = constant.getObjectValue();
return (V) new Value(objectValue);
} else if (expression instanceof ConstantNode) {
final ConstantNode constant = (ConstantNode) expression;
final Object value = constant.getValue();
return (V) new Value(value);
} else if (expression instanceof SimpleStringOperatorNode) {
final SimpleStringOperatorNode operatorNode = (SimpleStringOperatorNode) expression;
final String functionName = operatorNode.getMethodName().toUpperCase();
final ValueNode operand = operatorNode.getOperand();
final QueryValue condition = toQueryValue(operand);
return (V) new Function(functionName, condition);
} else if (expression instanceof CastNode) {
final CastNode castNode = (CastNode) expression;
final String typeName = castNode.getType().getSQLstring();
final ValueNode operand = castNode.getCastOperand();
final QueryValue condition = toQueryValue(operand);
return (V) new Cast(condition, typeName);
} else if (expression == null) {
return null;
} else {
setInvalidMessage("Unsupported expression" + expression.getClass() + " " + expression);
}
return null;
}
use of com.revolsys.record.query.Condition in project com.revolsys.open by revolsys.
the class RecordStoreQueryListModel method getRecords.
protected List<Record> getRecords(final String searchParam) {
if (Property.hasValue(searchParam) && searchParam.length() >= 2) {
final Map<String, Record> allObjects = new TreeMap<>();
for (Query query : this.queries) {
if (allObjects.size() < this.maxResults) {
query = query.clone();
query.setOrderBy(this.displayFieldName);
final Condition whereCondition = query.getWhereCondition();
if (whereCondition instanceof BinaryCondition) {
final BinaryCondition binaryCondition = (BinaryCondition) whereCondition;
if (binaryCondition.getOperator().equalsIgnoreCase("like")) {
final String likeString = "%" + searchParam.toUpperCase().replaceAll("[^A-Z0-9 ]", "%") + "%";
Q.setValue(0, binaryCondition, likeString);
} else {
Q.setValue(0, binaryCondition, searchParam);
}
}
query.setLimit(this.maxResults);
final Reader<Record> reader = this.recordStore.getRecords(query);
try {
final List<Record> objects = reader.toList();
for (final Record object : objects) {
if (allObjects.size() < this.maxResults) {
final String key = object.getString(this.displayFieldName);
if (!allObjects.containsKey(key)) {
if (searchParam.equals(key)) {
this.selectedItem = object;
}
allObjects.put(key, object);
}
}
}
} finally {
reader.close();
}
}
}
return new ArrayList<>(allObjects.values());
} else {
return Collections.emptyList();
}
}
use of com.revolsys.record.query.Condition in project com.revolsys.open by revolsys.
the class AbstractRecordQueryField method queryDo.
protected void queryDo(final int searchIndex, final String queryText) {
if (searchIndex == this.searchIndex.get()) {
Record selectedRecord = null;
final Map<String, Record> allRecords = new TreeMap<>();
for (Query query : this.queries) {
if (allRecords.size() < this.maxResults) {
query = //
query.clone().addOrderBy(this.displayField);
final Condition whereCondition = query.getWhereCondition();
if (whereCondition instanceof BinaryCondition) {
final BinaryCondition binaryCondition = (BinaryCondition) whereCondition;
if (binaryCondition.getOperator().equalsIgnoreCase("like")) {
final String likeString = "%" + queryText.toUpperCase().replaceAll("[^A-Z0-9 ]", "%") + "%";
Q.setValue(0, binaryCondition, likeString);
} else {
Q.setValue(0, binaryCondition, queryText);
}
}
query.setLimit(this.maxResults);
final List<Record> records = getRecords(query);
for (final Record record : records) {
if (allRecords.size() < this.maxResults) {
final String key = record.getString(this.displayField);
if (!allRecords.containsKey(key)) {
if (queryText.equals(key)) {
selectedRecord = record;
}
allRecords.put(key, record);
}
}
}
}
}
setSearchResults(searchIndex, allRecords.values(), selectedRecord);
}
}
use of com.revolsys.record.query.Condition in project com.revolsys.open by revolsys.
the class RecordLayerTablePanel method newToolBar.
protected void newToolBar(final Map<String, Object> pluginConfig) {
final ToolBar toolBar = getToolBar();
final RecordDefinition recordDefinition = getRecordDefinition();
final boolean hasGeometry = recordDefinition.hasGeometryField();
final MenuFactory layerMenuFactory = MenuFactory.findMenu(this.layer);
if (layerMenuFactory != null) {
toolBar.addButtonTitleIcon("menu", "Layer Menu", "menu", () -> layerMenuFactory.showMenu(this.layer, this, 10, 10));
}
if (hasGeometry) {
final EnableCheck hasSelectedRecords = new ObjectPropertyEnableCheck(this.layer, "hasSelectedRecords");
toolBar.addButton("layer", "Zoom to Selected", "magnifier_zoom_selected", hasSelectedRecords, this.layer::zoomToSelected);
toolBar.addButton("layer", "Pan to Selected", "pan_selected", hasSelectedRecords, this.layer::panToSelected);
}
final RecordLayerTable table = getTable();
final TableRowCount tableRowCount = new TableRowCount(table);
toolBar.addComponent("count", tableRowCount);
toolBar.addButtonTitleIcon("table", "Refresh", "table_refresh", this.layer::refresh);
toolBar.addButtonTitleIcon("table", "Export Records", "table_save", new ObjectPropertyEnableCheck(tableRowCount, "rowCount", 0, true), () -> actionExportRecords());
this.fieldSetsButton = toolBar.addButtonTitleIcon("table", "Field Sets", "fields_filter", () -> actionShowFieldSetsMenu());
this.fieldFilterPanel = new FieldFilterPanel(this, this.tableModel, pluginConfig);
if (this.fieldFilterPanel.isVisible()) {
toolBar.addComponent("search", this.fieldFilterPanel);
toolBar.addButtonTitleIcon("search", "Advanced Search", "filter_edits", this.fieldFilterPanel::showAdvancedFilter);
final EnableCheck hasFilter = new ObjectPropertyEnableCheck(this.tableModel, "hasFilter");
toolBar.addButton("search", "Clear Search", "filter_delete", hasFilter, this.fieldFilterPanel::clear);
final EnableCheck hasFilterHistory = new ObjectPropertyEnableCheck(this.tableModel, "hasFilterHistory");
toolBar.addButton("search", ConsumerAction.action("Search History", Icons.getIconWithBadge("book", "filter"), hasFilterHistory, (event) -> {
final Object source = event.getSource();
Component component = null;
if (source instanceof Component) {
component = (Component) source;
}
final BaseJPopupMenu menu = new BaseJPopupMenu();
for (final Condition filter : this.tableModel.getFilterHistory()) {
menu.addMenuItem(filter.toString(), () -> this.fieldFilterPanel.setFilter(filter));
}
menu.showMenu(component, 0, 20);
}));
}
// Filter buttons
boolean first = true;
for (final TableRecordsMode fieldFilterMode : this.tableModel.getFieldFilterModes()) {
final String key = fieldFilterMode.getKey();
final String title = fieldFilterMode.getTitle();
final Icon icon = fieldFilterMode.getIcon();
final EnableCheck enableCheck = fieldFilterMode.getEnableCheck();
final JToggleButton button = toolBar.addToggleButton(FILTER_FIELD, -1, null, title, icon, enableCheck, () -> {
if (this.tableModel != null) {
this.tableModel.setTableRecordsMode(fieldFilterMode);
}
});
this.buttonByMode.put(FILTER_FIELD + "_" + key, button);
if (first) {
button.doClick();
first = false;
}
}
if (hasGeometry) {
final JToggleButton showAllGeometries = addGeometryFilterToggleButton(toolBar, -1, "Show All Records ", "world_filter", "all", null);
showAllGeometries.doClick();
addGeometryFilterToggleButton(toolBar, -1, "Show Records on Map", "map_filter", "boundingBox", new ObjectPropertyEnableCheck(this.tableModel, "filterByBoundingBoxSupported"));
}
}
use of com.revolsys.record.query.Condition in project com.revolsys.open by revolsys.
the class FieldFilterPanel method propertyChange.
@Override
public void propertyChange(final PropertyChangeEvent event) {
final String propertyName = event.getPropertyName();
if (propertyName.equals("filter")) {
final Condition filter = (Condition) event.getNewValue();
setFilter(filter);
} else if (event.getSource() == this.searchField) {
updateCondition();
}
}
Aggregations