簡易ORMフレームワークを作成してみる(5)

検索バリエーションの追加

等号をシナリオが完成できたので、更にいろいろバリエーションを増やしていきます。ということで次に実現するシナリオを決定しましょう。等号の次といえばたはり不等号でしょうか。

[Test]
public void 不等号()
{
	QueryObject qo = new QueryObject();
	qo.Filter = qo.NotEq("COLUMN", 10);
	QueryObjectBuilder b = new SqlQueryObjectBuilder(qo);
	Assert.AreEqual(" Where [COLUMN] <> @p1", b.QueryText);
	Assert.AreEqual(10, b.Parameters[0].Value);
}


このバリエーションは今までの成果を使えば簡単そうです。NotEqファクトリをQueryObjectに追加してしまえば一丁上がりです。もしかしたら、メソッド名について突っ込みが入るかもしれませんが、Eqと同様にNotEqもファクトリなのですがCreateを省略しています。これは少し悩んだのですが、検索条件を組み立てるときに省略するほうが可読性が高いと判断した結果です。

[Serializable]
public class QueryObject
{
	...

	public FilterCriteria NotEq(string columnName, object value)
	{
		return CreateOperatorFilter(columnName, "<>", value);
	}
}

同じように、他のバリーションも追加しておきます。この時、Unitテストも忘れずに記述しておきましょう。フレームワークを作成においては、リファクタリングの機会は多いため、Unitテストはかかせません。なにより、Unitテストがあることで、安心して改造できます。

[Serializable]
public class QueryObject
{
	public FilterCriteria LessThan(string columnName, object value)
	{
		return CreateOperatorFilter(columnName, "<", value);
	}

	public FilterCriteria LessThanEq(string columnName, object value)
	{
		return CreateOperatorFilter(columnName, "<=", value);
	}

	public FilterCriteria GreaterThanEq(string columnName, object value)
	{
		return CreateOperatorFilter(columnName, ">=", value);
	}

	public FilterCriteria GreaterThan(string columnName, object value)
	{
		return CreateOperatorFilter(columnName, ">", value);
	}

	public FilterCriteria IsNull(string columnName)
	{
		return new FilterCriteria("{0} Is Null", columnName);
	}

	public FilterCriteria IsNotNull(string columnName)
	{
		return new FilterCriteria("{0} Is Not Null", columnName);
	}

	public FilterCriteria Between(string columnName, object startValue, object endvalue)
	{
		return new FilterCriteria("{0} Between {1} And {2}", 
				columnName,startValue, endvalue);
	}

	public FilterCriteria Like(string columnName, object value)
	{
		return CreateOperatorFilter(columnName,"Like", value);
	}

	public Criteria In(string columnName, params object items)
	{
		if (items.Length == 0) return null;
		string paraNames = new string[items.Length];
		for (int idx = 0; idx < items.Length; idx++)
		{
			paraNames[idx] = "{" + (idx+1).ToString() + "}";
		}
		return new FilterCriteria(
			"{0}" + string.Format(" In ({0})", string.Join(",", paraNames)), columnName,items);
	}
}