PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/Source/facebook.Linq/Linq/QueryBuilder2.cs

https://bitbucket.org/assaframan/facebooklinq
C# | 366 lines | 0 code | 47 blank | 319 comment | 0 complexity | 13a6a43cc7bcab44ccc80781a984e9e8 MD5 | raw file
  1. //using System;
  2. //using System.Collections.Generic;
  3. //using System.Linq;
  4. //using System.Web;
  5. //using System.Linq.Expressions;
  6. //using facebook.Linq;
  7. //using ConsoleApplication1.FqlToLinq;
  8. //using CodeRun.Util;
  9. //using System.Reflection;
  10. //
  11. //using ConsoleApplication1;
  12. //namespace facebook.Linq.LinqToFql
  13. //{
  14. // public class FqlQueryBuilder2
  15. // {
  16. // public FqlQueryBuilder2(Expression query)
  17. // {
  18. // Query = query;
  19. // }
  20. // public Expression Query;
  21. // public string BuildQuery()
  22. // {
  23. // SqlNode node = GetSqlExpressionTree();
  24. // return "";
  25. // }
  26. // public SqlNode GetSqlExpressionTree()
  27. // {
  28. // return Build(Query);
  29. // }
  30. // bool HasSelect;
  31. // SqlNode Build(string literal, Expression exp)
  32. // {
  33. // return new SqlValue(typeof(string), null, literal, true, exp);
  34. // }
  35. // //SqlNode Build(IEnumerable<Expression> exps)
  36. // //{
  37. // // foreach (var exp in exps)
  38. // // {
  39. // // Build(exp);
  40. // // }
  41. // //}
  42. // int InSelect = 0;
  43. // private SqlNode _Build(MethodCallExpression exp)
  44. // {
  45. // switch (exp.Method.Name)
  46. // {
  47. // case "Where":
  48. // return BuildWhere(exp);
  49. // case "Select":
  50. // return BuildSelect(exp);
  51. // case "Contains":
  52. // return BuildContains(exp);
  53. // case "Take":
  54. // return BuildTake(exp);
  55. // case "Skip":
  56. // return BuildSkip(exp);
  57. // default:
  58. // throw new Exception();
  59. // }
  60. // }
  61. // private SqlSkip BuildSkip(MethodCallExpression exp)
  62. // {
  63. // var source = Build(exp.Arguments[0]) as SqlExpression;
  64. // var amount = Build(exp.Arguments[1]) as SqlExpression;
  65. // return new SqlSkip(SqlNodeType.Skip, exp, source, amount);
  66. // }
  67. // private SqlTake BuildTake(MethodCallExpression exp)
  68. // {
  69. // var source = Build(exp.Arguments[0]) as SqlExpression;
  70. // var amount = Build(exp.Arguments[1]) as SqlExpression;
  71. // return new SqlTake(SqlNodeType.Take, exp, source, amount);
  72. // }
  73. // private SqlNode BuildContains(MethodCallExpression exp)
  74. // {
  75. // var source = Build(exp.Arguments[0]) as SqlExpression;
  76. // var element = Build(exp.Arguments[1]) as SqlExpression;
  77. // return new SqlContains(SqlNodeType.In, exp, source, element);
  78. // }
  79. // private SqlSelect BuildSelect(MethodCallExpression exp)
  80. // {
  81. // InSelect++;
  82. // if (!HasSelect)
  83. // {
  84. // HasSelect = true;
  85. // Select = ((UnaryExpression)exp.Arguments[1]).Operand;
  86. // }
  87. // var selection = Build(exp.Arguments[1]) as SqlExpression;
  88. // var from = Build(exp.Arguments[0]) as SqlExpression;
  89. // InSelect--;
  90. // return new SqlSelect(selection, from, exp);
  91. // }
  92. // private SqlNode BuildWhere(MethodCallExpression exp)
  93. // {
  94. // var source = Build(exp.Arguments[1]) as SqlExpression;
  95. // var condition = Build(exp.Arguments[0]) as SqlExpression;
  96. // return new Where(SqlNodeType.Where, exp, source, condition);
  97. // }
  98. // #region switch
  99. // private SqlNode Build(Expression exp)
  100. // {
  101. // switch (exp.NodeType)
  102. // {
  103. // case ExpressionType.Call:
  104. // return _Build((MethodCallExpression)exp);
  105. // case ExpressionType.Constant:
  106. // return _Build((ConstantExpression)exp);
  107. // case ExpressionType.Quote:
  108. // return _Build((UnaryExpression)exp);
  109. // case ExpressionType.Lambda:
  110. // return _Build((LambdaExpression)exp);
  111. // case ExpressionType.Equal:
  112. // return _Build((BinaryExpression)exp);
  113. // case ExpressionType.MemberAccess:
  114. // return _Build((MemberExpression)exp);
  115. // case ExpressionType.Add:
  116. // return _Build((BinaryExpression)exp);
  117. // case ExpressionType.New:
  118. // return _Build((NewExpression)exp);
  119. // case ExpressionType.AddChecked:
  120. // case ExpressionType.And:
  121. // case ExpressionType.AndAlso:
  122. // case ExpressionType.ArrayIndex:
  123. // case ExpressionType.ArrayLength:
  124. // case ExpressionType.Coalesce:
  125. // case ExpressionType.Conditional:
  126. // case ExpressionType.Convert:
  127. // case ExpressionType.ConvertChecked:
  128. // case ExpressionType.Divide:
  129. // case ExpressionType.ExclusiveOr:
  130. // case ExpressionType.GreaterThan:
  131. // case ExpressionType.GreaterThanOrEqual:
  132. // case ExpressionType.Invoke:
  133. // case ExpressionType.LeftShift:
  134. // case ExpressionType.LessThan:
  135. // case ExpressionType.LessThanOrEqual:
  136. // case ExpressionType.ListInit:
  137. // case ExpressionType.MemberInit:
  138. // case ExpressionType.Modulo:
  139. // case ExpressionType.Multiply:
  140. // case ExpressionType.MultiplyChecked:
  141. // case ExpressionType.Negate:
  142. // case ExpressionType.NegateChecked:
  143. // case ExpressionType.NewArrayBounds:
  144. // case ExpressionType.NewArrayInit:
  145. // case ExpressionType.Not:
  146. // case ExpressionType.NotEqual:
  147. // case ExpressionType.Or:
  148. // case ExpressionType.OrElse:
  149. // case ExpressionType.Parameter:
  150. // case ExpressionType.Power:
  151. // case ExpressionType.RightShift:
  152. // case ExpressionType.Subtract:
  153. // case ExpressionType.SubtractChecked:
  154. // case ExpressionType.TypeAs:
  155. // case ExpressionType.TypeIs:
  156. // case ExpressionType.UnaryPlus:
  157. // default:
  158. // throw new NotImplementedException(exp.NodeType + " is not supported");
  159. // }
  160. // }
  161. // #endregion
  162. // private SqlNode _Build(NewExpression exp)
  163. // {
  164. // throw new NotImplementedException();
  165. // //bool first = true;
  166. // //foreach (var arg in exp.Arguments)
  167. // //{
  168. // // if (first)
  169. // // first = false;
  170. // // else
  171. // // Write(",");
  172. // // Build(arg);
  173. // //}
  174. // }
  175. // private SqlNode _Build(MemberExpression exp)
  176. // {
  177. // var member = exp.Member;
  178. // var memberType = ReflectionHelper.GetMemberType(member);
  179. // if (typeof(IFqlDataQuery).IsAssignableFrom(memberType)) //Query
  180. // {
  181. // if (exp.Expression is ConstantExpression)
  182. // {
  183. // var obj = ((ConstantExpression)(exp.Expression)).Value;
  184. // var value = ReflectionHelper.GetMemberValue(member, obj);
  185. // //new FqlQueryBuilder2(value)
  186. // Build(value);
  187. // }
  188. // else
  189. // throw new NotSupportedException();
  190. // }
  191. // else if (typeof(IFqlTable).IsAssignableFrom(memberType)) //Table
  192. // {
  193. // var tableRowType = ((PropertyInfo)exp.Member).PropertyType.GetGenericArguments()[0];
  194. // var td = KnownTypeData.GetTypeData(tableRowType);
  195. // return new SqlTable(exp, td.FqlTableName);
  196. // }
  197. // else //Column
  198. // {
  199. // var memberName = exp.Member.Name;
  200. // var td = KnownTypeData.GetTypeData(exp.Member.DeclaringType);
  201. // if (td.Properties.ContainsKey(memberName))
  202. // {
  203. // var pd = td.Properties[exp.Member.Name];
  204. // return new SqlColumnRef(exp, pd.FqlFieldName);
  205. // }
  206. // else //Variable
  207. // {
  208. // if (exp.Expression is ConstantExpression)
  209. // {
  210. // var obj = ((ConstantExpression)(exp.Expression)).Value;
  211. // var value = ReflectionHelper.GetMemberValue(member, obj);
  212. // return new SqlValue(value.GetType(), null, value, false, exp);
  213. // }
  214. // else
  215. // throw new NotSupportedException();
  216. // }
  217. // }
  218. // throw new NotSupportedException();
  219. // }
  220. // private SqlNode _Build(BinaryExpression exp)
  221. // {
  222. // var left = Build(exp.Left) as SqlExpression;
  223. // var right = Build(exp.Right) as SqlExpression;
  224. // return new SqlBinary(exp.NodeType.Convert(), null, null, left, right);
  225. // }
  226. // private SqlNode _Build(LambdaExpression exp)
  227. // {
  228. // return Build(exp.Body);
  229. // }
  230. // private SqlNode _Build(UnaryExpression exp)
  231. // {
  232. // return Build(exp.Operand);
  233. // }
  234. // private SqlNode _Build(ConstantExpression exp)
  235. // {
  236. // var value = exp.Value;
  237. // var type = value.GetType();
  238. // if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(FqlTable<>))
  239. // {
  240. // var elemType = TypeSystem.GetElementType(type);
  241. // return new SqlTable(exp, KnownTypeData.GetTypeData(elemType).FqlTableName);
  242. // }
  243. // else
  244. // return Build(exp.Value);
  245. // }
  246. // private SqlNode Build(object value)
  247. // {
  248. // if (value is Expression)
  249. // return Build((Expression)value);
  250. // else if (value is string)
  251. // return Build((string)value);
  252. // else if (value is int)
  253. // return _Build((int)value);
  254. // else if (value is long)
  255. // return _Build((long)value);
  256. // else if (value is IFqlDataQuery)
  257. // {
  258. // var innerQuery = (IFqlDataQuery)value;
  259. // return innerQuery.GetSqlTree();
  260. // /*var innerQueryText = innerQuery.ToString();
  261. // if (InSelect > 0 && innerQueryText.StartsWith("from"))
  262. // {
  263. // Write(innerQueryText.Substring(4));
  264. // }
  265. // else
  266. // {
  267. // Write("(");
  268. // Write(innerQueryText);//
  269. // Write(")");
  270. // }*/
  271. // }
  272. // else
  273. // throw new NotImplementedException("");
  274. // }
  275. // #region Numbers
  276. // private SqlNode _Build(int p)
  277. // {
  278. // return new SqlValue(typeof(int), null, p, false, null);
  279. // }
  280. // private SqlNode _Build(uint p)
  281. // {
  282. // return new SqlValue(typeof(uint), null, p, false, null);
  283. // }
  284. // private SqlNode _Build(long p)
  285. // {
  286. // return new SqlValue(typeof(long), null, p, false, null);
  287. // }
  288. // private SqlNode _Build(ulong p)
  289. // {
  290. // return new SqlValue(typeof(ulong), null, p, false, null);
  291. // }
  292. // private SqlNode _Build(float p)
  293. // {
  294. // return new SqlValue(typeof(float), null, p, false, null);
  295. // }
  296. // private SqlNode _Build(double p)
  297. // {
  298. // return new SqlValue(typeof(double), null, p, false, null);
  299. // }
  300. // private SqlNode _Build(byte p)
  301. // {
  302. // return new SqlValue(typeof(byte), null, p, false, null);
  303. // }
  304. // private SqlNode _Build(sbyte p)
  305. // {
  306. // return new SqlValue(typeof(sbyte), null, p, false, null);
  307. // }
  308. // private SqlNode _Build(short p)
  309. // {
  310. // return new SqlValue(typeof(short), null, p, false, null);
  311. // }
  312. // private SqlNode _Build(ushort p)
  313. // {
  314. // return new SqlValue(typeof(ushort), null, p, false, null);
  315. // }
  316. // #endregion
  317. // public Expression Select { get; set; }
  318. // }
  319. //}