protected override Expression VisitConstant(ConstantExpression node) { if (node.Value is ITable) { var table = (node.Value as ITable); TableName = table.GetTableName(); AllowFiltering = table.GetEntityType().GetCustomAttributes(typeof(AllowFilteringAttribute), false).Any(); var props = table.GetEntityType().GetPropertiesOrFields(); foreach (var prop in props) { var memName = CqlQueryTools.CalculateMemberName(prop); Alter[prop.Name] = memName; } return node; } else if (phasePhase.get() == ParsePhase.Condition) { WhereClause.Append(node.Value.Encode()); return node; } else if (phasePhase.get() == ParsePhase.SelectBinding) { if (Alter.ContainsKey(currentBindingName.get())) { Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), node.Value, Mappings.Count); SelectFields.Add(currentBindingName.get()); } else { Mappings[currentBindingName.get()] = Tuple.Create<string, object, int>(null, node.Value, Mappings.Count); } return node; } else if (phasePhase.get() == ParsePhase.Take) { Limit = (int)node.Value; return node; } else if (phasePhase.get() == ParsePhase.OrderBy || phasePhase.get() == ParsePhase.OrderByDescending) { OrderBy.Add(Alter[(string)node.Value].CqlIdentifier() + (phasePhase.get() == ParsePhase.OrderBy ? " ASC" : " DESC")); return node; } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitBinary(BinaryExpression node) { if (phasePhase.get() == ParsePhase.Condition) { if (CQLTags.ContainsKey(node.NodeType)) { if (IsCompareTo(node.Left)) { if (IsZero(node.Right)) { using (binaryExpressionTag.set(CQLTags[node.NodeType])) this.Visit(node.Left); return(node); } } else if (IsCompareTo(node.Right)) { if (IsZero(node.Left)) { using (binaryExpressionTag.set(CQLTags[CQLInvTags[node.NodeType]])) this.Visit(node.Right); return(node); } } else { this.Visit(node.Left); WhereClause.Append(" " + CQLTags[node.NodeType] + " "); this.Visit(node.Right); return(node); } } } else if (phasePhase.get() == ParsePhase.SelectBinding) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); if (Alter.ContainsKey(currentBindingName.get())) { Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), val, Mappings.Count); SelectFields.Add(currentBindingName.get()); } else { Mappings[currentBindingName.get()] = Tuple.Create <string, object, int>(null, val, Mappings.Count); } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Select") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.What)) this.Visit(node.Arguments[1]); return(node); } else if (node.Method.Name == "Where") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Condition)) { if (WhereClause.Length != 0) { WhereClause.Append(" AND "); } this.Visit(node.Arguments[1]); } return(node); } else if (node.Method.Name == "Take") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Take)) this.Visit(node.Arguments[1]); return(node); } else if (node.Method.Name == "OrderBy" || node.Method.Name == "ThenBy") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderBy)) this.Visit(node.Arguments[1]); return(node); } else if (node.Method.Name == "OrderByDescending" || node.Method.Name == "ThenByDescending") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderByDescending)) this.Visit(node.Arguments[1]); return(node); } else if (node.Method.Name == "FirstOrDefault" || node.Method.Name == "First") { this.Visit(node.Arguments[0]); if (node.Arguments.Count == 3) { using (phasePhase.set(ParsePhase.Condition)) this.Visit(node.Arguments[2]); } Limit = 1; return(node); } if (phasePhase.get() == ParsePhase.Condition) { if (node.Method.Name == "Contains") { Expression what = null; Expression inp = null; if (node.Object == null) { what = node.Arguments[1]; inp = node.Arguments[0]; } else { what = node.Arguments[0]; inp = node.Object; } this.Visit(what); WhereClause.Append(" IN ("); var values = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke(); bool first = false; foreach (var obj in values) { if (!first) { first = true; } else { WhereClause.Append(", "); } WhereClause.Append(obj.Encode()); } if (!first) { throw new CqlArgumentException("Collection " + inp.ToString() + " is empty."); } WhereClause.Append(")"); return(node); } else if (node.Method.Name == "CompareTo") { this.Visit(node.Object); WhereClause.Append(" " + binaryExpressionTag.get() + " "); this.Visit(node.Arguments[0]); return(node); } else if (node.Method.Name == "Equals") { this.Visit(node.Object); WhereClause.Append(" = "); this.Visit(node.Arguments[0]); return(node); } else if (node.Type.Name == "CqlToken") { WhereClause.Append("token("); var exprs = node.Arguments; this.Visit(exprs.First()); foreach (var e in exprs.Skip(1)) { WhereClause.Append(", "); this.Visit(e); } WhereClause.Append(")"); return(node); } else { var val = Expression.Lambda(node).Compile().DynamicInvoke(); WhereClause.Append(val.Encode()); return(node); } } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitMemberInit(MemberInitExpression node) { if (phasePhase.get() == ParsePhase.SelectBinding) { foreach (var binding in node.Bindings) { if (binding is MemberAssignment) { using (currentBindingName.set(binding.Member.Name)) this.Visit((binding as MemberAssignment).Expression); } } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitBinary(BinaryExpression node) { if (phasePhase.get() == ParsePhase.Condition) { if (CQLTags.ContainsKey(node.NodeType)) { if (IsCompareTo(node.Left)) { if (IsZero(node.Right)) { using (binaryExpressionTag.set(CQLTags[node.NodeType])) Visit(node.Left); return(node); } } else if (IsCompareTo(node.Right)) { if (IsZero(node.Left)) { using (binaryExpressionTag.set(CQLTags[CQLInvTags[node.NodeType]])) Visit(node.Right); return(node); } } else { Visit(DropNullableConversion(node.Left)); currentConditionBuilder.get().Append(" " + CQLTags[node.NodeType] + " "); Visit(DropNullableConversion(node.Right)); return(node); } } else if (!CQLUnsupTags.Contains(node.NodeType)) { object val = Expression.Lambda(node).Compile().DynamicInvoke(); currentConditionBuilder.get().Append(cqlTool.AddValue(val)); return(node); } } else if (phasePhase.get() == ParsePhase.SelectBinding) { object val = Expression.Lambda(node).Compile().DynamicInvoke(); if (Alter.ContainsKey(currentBindingName.get())) { Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), val, Mappings.Count); SelectFields.Add(currentBindingName.get()); } else { Mappings[currentBindingName.get()] = Tuple.Create <string, object, int>(null, val, Mappings.Count); } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Select") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.What)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "Where") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Condition)) { if (WhereClause.Length != 0) { WhereClause.Append(" AND "); } Visit(node.Arguments[1]); } return(node); } if (node.Method.Name == "UpdateIf" || node.Method.Name == "DeleteIf") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Condition)) { if (UpdateIfClause.Length != 0) { UpdateIfClause.Append(" AND "); } using (currentConditionBuilder.set(UpdateIfClause)) this.Visit(node.Arguments[1]); } return(node); } if (node.Method.Name == "Take") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Take)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "OrderBy" || node.Method.Name == "ThenBy") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderBy)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "OrderByDescending" || node.Method.Name == "ThenByDescending") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderByDescending)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "FirstOrDefault" || node.Method.Name == "First") { Visit(node.Arguments[0]); if (node.Arguments.Count == 3) { using (phasePhase.set(ParsePhase.Condition)) Visit(node.Arguments[2]); } Limit = 1; return(node); } if (phasePhase.get() == ParsePhase.Condition) { if (node.Method.Name == "Contains") { Expression what = null; Expression inp = null; if (node.Object == null) { what = node.Arguments[1]; inp = node.Arguments[0]; } else { what = node.Arguments[0]; inp = node.Object; } Visit(what); currentConditionBuilder.get().Append(" IN ("); var values = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke(); bool first = false; foreach (object obj in values) { if (!first) { first = true; } else { currentConditionBuilder.get().Append(", "); } currentConditionBuilder.get().Append(cqlTool.AddValue(obj)); } currentConditionBuilder.get().Append(")"); return(node); } if (node.Method.Name == "CompareTo") { Visit(node.Object); currentConditionBuilder.get().Append(" " + binaryExpressionTag.get() + " "); Visit(node.Arguments[0]); return(node); } if (node.Method.Name == "Equals") { Visit(node.Object); currentConditionBuilder.get().Append(" = "); Visit(node.Arguments[0]); return(node); } if (node.Type.Name == "CqlToken") { currentConditionBuilder.get().Append("token("); ReadOnlyCollection <Expression> exprs = node.Arguments; Visit(exprs.First()); foreach (Expression e in exprs.Skip(1)) { currentConditionBuilder.get().Append(", "); Visit(e); } currentConditionBuilder.get().Append(")"); return(node); } object val = Expression.Lambda(node).Compile().DynamicInvoke(); currentConditionBuilder.get().Append(cqlTool.AddValue(val)); return(node); } if (node.Method.Name == "AllowFiltering") { Visit(node.Arguments[0]); AllowFiltering = true; return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }