Working with Design Patterns: Composite, Page 2
Moving on, I can start rapidly adding support for additional SQL where clause constructs. Like, for example, like:
// LikeTest.java:
import static org.junit.Assert.*;
import org.junit.*;
public class LikeTest {
@Test
public void simple() {
Like like = new Like(new StringColumn("name", 1), "Joe%");
assertEquals("name like 'Joe%'", like.sql());
}
}
// Like.java:
public class Like {
private StringColumn column;
private String value;
public Like(StringColumn column, String value) {
this.column = column;
this.value = value;
}
public String sql() {
return String.format("%s like %s",
column.getName(), column.sqlValue(value));
}
}
Right now, the And class supports joining only two Equals objects. I want to have And support Like objects as well, or any other conditional that I might dream up. I can extract a common interface that represents the ability of each to return an SQL representation:
public interface Criteria {
String sqlString();
}
// EqualsTest.java:
import static org.junit.Assert.*;
import org.junit.*;
public class EqualsTest {
@Test
public void stringColumn() {
Column column = new StringColumn("name", 10);
Criteria criteria = new Equals(column, "joe");
assertEquals("name = 'joe'", criteria.sqlString());
}
@Test
public void numericColumn() {
Column column = new NumericColumn("amount");
Criteria criteria = new Equals(column, 5);
assertEquals("amount = 5", criteria.sqlString());
}
}
// Equals.java:
public class Equals implements Criteria {
private Column column;
private Object value;
public Equals(Column column, Object value) {
this.column = column;
this.value = value;
}
public String sqlString() {
return String.format("%s = %s",
column.getName(), column.sqlValue(value));
}
}
I can modify the Like class to implement the same Criteria interface. This requires me to do a bit of refactoring because I wasn't consistent with the method names.
// LikeTest.java:
import static org.junit.Assert.*;
import org.junit.*;
public class LikeTest {
@Test
public void simple() {
Criteria like = new Like(new StringColumn("name", 1), "Joe%");
assertEquals("name like 'Joe%'", like.sqlString());
}
}
// Like.java
public class Like implements Criteria {
private StringColumn column;
private String value;
public Like(StringColumn column, String value) {
this.column = column;
this.value = value;
}
public String sqlString() {
return String.format("%s like %s",
column.getName(), column.sqlValue(value));
}
}
0 Comments (click to add your comment)
Networking Solutions
