John N's colleague's approach to problem solving is best described as follows. The solution to any given problem is to introduce two additional problems. While this approach generated quite a many interesting implementations, it rarely produced the needed results: simple, custom software for their clients. Ultimately, this approach led towards his de-hiring, which meant that John would have to maintain his old systems.
One project that John inherited was a fairly simple web application that tracked overtime. Simple, that is, from the front end. The back end PHP code was responsible for querying a MySQL database with queries similar to this:
SELECT * FROM bean_overtime_availability WHERE `startDateTime` >= DATE(NOW()) AND `available` = 1;
Seems simple enough, right? Here's the code used to generate that query.
public function getOvertimeAvailability() {
$c = new Criteria();
$c->leftParenthesis();
$c->field('startDateTime');
$c->greaterThanOrEqualTo();
$c->quote($this->getToday());
$c->rightParenthesis();
$c->andCriteria(
Criteria::newCriteria()->field('available')->
equal()->quote(1)
);
$c->addString(' order by startDateTime;');
return $this->getPersistenceLayer()->
selectBeans($this->getOvertimeAvailabilityBeanDefinition(),$c);
}
Thinking that the code looked far too simple, John assumed the Criteria class was a kind of magical black box that performed some kind of SQL-fu to make things a lot easier / more efficient. And then he peeked into the Criteria class.
class Criteria extends Object {
protected function add($c) {
$this->getList()->add($c);
}
protected function getList() {
if (is_null($this->list))
$this->list = new ArrayList;
return $this->list;
}
public function leftParenthesis() {
$this->add('(');
return $this;
}
public function rightParenthesis() {
$this->add(')');
return $this;
}
public function comma() {
$this->add(',');
return $this;
}
public function space() {
$this->add(' ');
return $this;
}
public function quote($text) {
$this->add("\"$text\"");
return $this;
}
public function field($text) {
$this->add("`$text`");
return $this;
}
public function equal() {
$this->add('=');
return $this;
}
public function null() {
$this->add('null');
return $this;
}
public function in() {
$this->add('in');
return $this;
}
public function not() {
$this->add('!');
return $this;
}
public function notEqual() {
$this->not();
$this->equals();
return $this;
}
public function lessThan() {
$this->add('<');
return $this;
}
public function lassThanOrEqualTo() {
$this->lessThan();
$this->equals();
return $this;
}
public function greaterThan() {
$this->add('>');
return $this;
}
public function greaterThanOrEqualTo() {
$this->greaterThan();
$this->equal();
return $this;
}
public function addCriteria($c) {
$this->leftParenthesis();
$this->add($c->toString());
$this->rightParenthesis();
return $this;
}
public function operator($operator) {
$this->add($operator);
return $this;
}
public function andCriteria(&$c) {
$this->add('and');
$this->leftParenthesis();
$this->add($c);
$this->rightParenthesis();
}
public function orCriteria(&$c) {
$this->add('or');
$this->leftParenthesis();
$this->add($c);
$this->rightParenthesis();
}
public function addString($str) {
$this->add($str);
return $this;
}
public function toString() {
return implode('',$this->getList()->getItems());
}
static function newCriteria() {
return new Criteria();
}
}