dcsimg
August 18, 2018
Hot Topics:

Working with Design Patterns: Composite

  • July 2, 2007
  • By Jeff Langr
  • Send Email »
  • More Articles »

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));
   }
}




Page 2 of 3



Comment and Contribute

 


(Maximum characters: 1200). You have characters left.

 

 


Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

By submitting your information, you agree that developer.com may send you developer offers via email, phone and text message, as well as email offers about other products and services that developer believes may be of interest to you. developer will process your information in accordance with the Quinstreet Privacy Policy.

Sitemap

Thanks for your registration, follow us on our social networks to keep up-to-date