Refact where method
This commit is contained in:
		
							parent
							
								
									7948705181
								
							
						
					
					
						commit
						44c53f6dd5
					
				| @ -3,7 +3,6 @@ | ||||
| Yet Another ORM library for Go, aims for developer friendly | ||||
| 
 | ||||
| ## TODO | ||||
| * Offset | ||||
| * Or query | ||||
| * Not query | ||||
| * Better First method (First(&user, primary_key, where conditions)) | ||||
|  | ||||
							
								
								
									
										4
									
								
								orm.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								orm.go
									
									
									
									
									
								
							| @ -19,6 +19,8 @@ type Orm struct { | ||||
| 	db          *sql.DB | ||||
| 	driver      string | ||||
| 	whereClause []map[string]interface{} | ||||
| 	orClause    []map[string]interface{} | ||||
| 	notClause   []map[string]interface{} | ||||
| 	selectStr   string | ||||
| 	orderStrs   []string | ||||
| 	offsetStr   string | ||||
| @ -145,10 +147,12 @@ func (s *Orm) Pluck(column string, value interface{}) (orm *Orm) { | ||||
| } | ||||
| 
 | ||||
| func (s *Orm) Or(querystring interface{}, args ...interface{}) *Orm { | ||||
| 	s.orClause = append(s.orClause, map[string]interface{}{"query": querystring, "args": args}) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| func (s *Orm) Not(querystring interface{}, args ...interface{}) *Orm { | ||||
| 	s.notClause = append(s.notClause, map[string]interface{}{"query": querystring, "args": args}) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -273,3 +273,11 @@ func TestOffset(t *testing.T) { | ||||
| 		t.Errorf("Offset should works perfectly") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestWhereOr(t *testing.T) { | ||||
| 	// var users []User
 | ||||
| 	// db.Where("name = ?", "1").Or("name = ?", "3").Find(&users)
 | ||||
| 	// if len(users) != 3 {
 | ||||
| 	// 	t.Errorf("Should find three users with name 1 and 3")
 | ||||
| 	// }
 | ||||
| } | ||||
|  | ||||
							
								
								
									
										92
									
								
								sql.go
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								sql.go
									
									
									
									
									
								
							| @ -50,10 +50,11 @@ func (s *Orm) query(out interface{}) { | ||||
| 		is_slice = true | ||||
| 		dest_type = dest_out.Type().Elem() | ||||
| 	} | ||||
| 	debug(s.Sql) | ||||
| 	debug(s.SqlVars) | ||||
| 
 | ||||
| 	rows, err := s.db.Query(s.Sql, s.SqlVars...) | ||||
| 	defer rows.Close() | ||||
| 
 | ||||
| 	s.Error = err | ||||
| 	if rows.Err() != nil { | ||||
| 		s.Error = rows.Err() | ||||
| @ -167,43 +168,72 @@ func (s *Orm) deleteSql(value interface{}) { | ||||
| 	s.Sql = fmt.Sprintf("DELETE FROM %v %v", s.TableName, s.combinedSql()) | ||||
| 	return | ||||
| } | ||||
| func (s *Orm) buildWhereCondition(clause map[string]interface{}) string { | ||||
| 	str := "( " + clause["query"].(string) + " )" | ||||
| 
 | ||||
| func (s *Orm) whereSql() (sql string) { | ||||
| 	var conditions []string | ||||
| 	if !s.model.PrimaryKeyIsEmpty() { | ||||
| 		conditions = append(conditions, fmt.Sprintf("(%v = %v)", s.quote(s.model.PrimaryKeyDb()), s.addToVars(s.model.PrimaryKeyValue()))) | ||||
| 	} | ||||
| 	args := clause["args"].([]interface{}) | ||||
| 	for _, arg := range args { | ||||
| 		switch reflect.TypeOf(arg).Kind() { | ||||
| 		case reflect.Slice: // For where("id in (?)", []int64{1,2})
 | ||||
| 			v := reflect.ValueOf(arg) | ||||
| 
 | ||||
| 	if len(s.whereClause) > 0 { | ||||
| 		for _, clause := range s.whereClause { | ||||
| 			str := "( " + clause["query"].(string) + " )" | ||||
| 			args := clause["args"].([]interface{}) | ||||
| 			for _, arg := range args { | ||||
| 				switch reflect.TypeOf(arg).Kind() { | ||||
| 				case reflect.Slice: // For where("id in (?)", []int64{1,2})
 | ||||
| 					v := reflect.ValueOf(arg) | ||||
| 
 | ||||
| 					var temp_marks []string | ||||
| 					for i := 0; i < v.Len(); i++ { | ||||
| 						temp_marks = append(temp_marks, "?") | ||||
| 					} | ||||
| 
 | ||||
| 					str = strings.Replace(str, "?", strings.Join(temp_marks, ","), 1) | ||||
| 
 | ||||
| 					for i := 0; i < v.Len(); i++ { | ||||
| 						str = strings.Replace(str, "?", s.addToVars(v.Index(i).Addr().Interface()), 1) | ||||
| 					} | ||||
| 				default: | ||||
| 					str = strings.Replace(str, "?", s.addToVars(arg), 1) | ||||
| 				} | ||||
| 			var temp_marks []string | ||||
| 			for i := 0; i < v.Len(); i++ { | ||||
| 				temp_marks = append(temp_marks, "?") | ||||
| 			} | ||||
| 			conditions = append(conditions, str) | ||||
| 
 | ||||
| 			str = strings.Replace(str, "?", strings.Join(temp_marks, ","), 1) | ||||
| 
 | ||||
| 			for i := 0; i < v.Len(); i++ { | ||||
| 				str = strings.Replace(str, "?", s.addToVars(v.Index(i).Addr().Interface()), 1) | ||||
| 			} | ||||
| 		default: | ||||
| 			str = strings.Replace(str, "?", s.addToVars(arg), 1) | ||||
| 		} | ||||
| 	} | ||||
| 	return str | ||||
| } | ||||
| 
 | ||||
| 	if len(conditions) > 0 { | ||||
| 		sql = "WHERE " + strings.Join(conditions, " AND ") | ||||
| func (s *Orm) whereSql() (sql string) { | ||||
| 	var primary_condiation string | ||||
| 	var and_conditions, or_conditions, not_conditions []string | ||||
| 
 | ||||
| 	if !s.model.PrimaryKeyIsEmpty() { | ||||
| 		primary_condiation = fmt.Sprintf("(%v = %v)", s.quote(s.model.PrimaryKeyDb()), s.addToVars(s.model.PrimaryKeyValue())) | ||||
| 	} | ||||
| 
 | ||||
| 	for _, clause := range s.whereClause { | ||||
| 		and_conditions = append(and_conditions, s.buildWhereCondition(clause)) | ||||
| 	} | ||||
| 
 | ||||
| 	for _, clause := range s.notClause { | ||||
| 		and_conditions = append(and_conditions, "!"+s.buildWhereCondition(clause)) | ||||
| 	} | ||||
| 
 | ||||
| 	for _, clause := range s.orClause { | ||||
| 		or_conditions = append(or_conditions, s.buildWhereCondition(clause)) | ||||
| 	} | ||||
| 
 | ||||
| 	and_sql := strings.Join(and_conditions, " AND ") | ||||
| 	or_sql := strings.Join(not_conditions, " OR ") | ||||
| 	combined_conditions := and_sql | ||||
| 	if len(combined_conditions) > 0 { | ||||
| 		if len(or_sql) > 0 { | ||||
| 			combined_conditions = combined_conditions + " OR " + or_sql | ||||
| 		} | ||||
| 	} else { | ||||
| 		combined_conditions = or_sql | ||||
| 	} | ||||
| 
 | ||||
| 	if len(primary_condiation) > 0 { | ||||
| 		sql = "WHERE " + primary_condiation | ||||
| 		if len(combined_conditions) > 0 { | ||||
| 			sql = sql + " AND ( " + combined_conditions + " )" | ||||
| 		} | ||||
| 	} else if len(combined_conditions) > 0 { | ||||
| 		sql = "WHERE " + combined_conditions | ||||
| 	} | ||||
| 	debug(sql) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu