forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQueryJoinFragment.cs
134 lines (117 loc) · 3.43 KB
/
QueryJoinFragment.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using NHibernate.Util;
namespace NHibernate.SqlCommand
{
/// <summary>
/// Summary description for QueryJoinFragment.
/// </summary>
public class QueryJoinFragment : JoinFragment
{
private SqlStringBuilder afterFrom = new SqlStringBuilder();
private SqlStringBuilder afterWhere = new SqlStringBuilder();
private Dialect.Dialect dialect;
private bool useThetaStyleInnerJoins;
public QueryJoinFragment(Dialect.Dialect dialect, bool useThetaStyleInnerJoins)
{
this.dialect = dialect;
this.useThetaStyleInnerJoins = useThetaStyleInnerJoins;
}
public override void AddJoin(string tableName, string alias, string[] fkColumns, string[] pkColumns, JoinType joinType)
{
AddJoin(tableName, alias, alias, fkColumns, pkColumns, joinType, null);
}
private void AddJoin(string tableName, string alias, string concreteAlias, string[] fkColumns, string[] pkColumns,
JoinType joinType, SqlString on)
{
if (!useThetaStyleInnerJoins || joinType != JoinType.InnerJoin)
{
JoinFragment jf = dialect.CreateOuterJoinFragment();
jf.AddJoin(tableName, alias, fkColumns, pkColumns, joinType, on);
AddFragment(jf);
}
else
{
AddCrossJoin(tableName, alias);
AddCondition(concreteAlias, fkColumns, pkColumns);
AddCondition(on);
}
}
public override void AddJoin(string tableName, string alias, string[] fkColumns, string[] pkColumns, JoinType joinType,
SqlString on)
{
AddJoin(tableName, alias, alias, fkColumns, pkColumns, joinType, on);
}
public override SqlString ToFromFragmentString
{
get { return afterFrom.ToSqlString(); }
}
public override SqlString ToWhereFragmentString
{
get { return afterWhere.ToSqlString(); }
}
public override void AddJoins(SqlString fromFragment, SqlString whereFragment)
{
afterFrom.Add(fromFragment);
afterWhere.Add(whereFragment);
}
public override void AddCrossJoin(string tableName, string alias)
{
afterFrom.Add(StringHelper.CommaSpace + tableName + ' ' + alias);
}
private void AddCondition(string alias, string[] fkColumns, string[] pkColumns)
{
for (int j = 0; j < fkColumns.Length; j++)
{
afterWhere
.Add(" and ")
.Add(fkColumns[j])
.Add("=")
.Add(alias)
.Add(".")
.Add(pkColumns[j]);
}
}
public override bool AddCondition(string condition)
{
//TODO: this seems hackish
var trimCondition = condition.Trim();
if (trimCondition.Length > 0 &&
afterFrom.ToSqlString().IndexOfOrdinal(trimCondition) < 0 &&
afterWhere.ToSqlString().IndexOfOrdinal(trimCondition) < 0)
{
if (!condition.StartsWith(" and ", StringComparison.Ordinal))
{
afterWhere.Add(" and ");
}
afterWhere.Add(condition);
return true;
}
return false;
}
public override bool AddCondition(SqlString condition)
{
//TODO: this seems hackish
var trimCondition = condition.Trim().ToString();
if (trimCondition.Length > 0 &&
afterFrom.ToString().IndexOf(trimCondition, StringComparison.Ordinal) < 0 &&
afterWhere.ToString().IndexOf(trimCondition, StringComparison.Ordinal) < 0)
{
if (!condition.StartsWithCaseInsensitive(" and "))
{
afterWhere.Add(" and ");
}
afterWhere.Add(condition);
return true;
}
return false;
}
public override void AddFromFragmentString(SqlString fromFragmentString)
{
afterFrom.Add(fromFragmentString);
}
public void ClearWherePart()
{
afterWhere.Clear();
}
}
}