1 /*
2  * Entity - Entity is an object-relational mapping tool for the D programming language. Referring to the design idea of JPA.
3  *
4  * Copyright (C) 2015-2018  Shanghai Putao Technology Co., Ltd
5  *
6  * Developer: HuntLabs.cn
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.entity.criteria.CriteriaUpdate;
13 
14 import hunt.entity;
15 import hunt.logging;
16 import std.variant;
17 
18 class CriteriaUpdate(T : Object, F : Object = T) : CriteriaBase!(T,F)
19 {
20     this(CriteriaBuilder criteriaBuilder) {
21         super(criteriaBuilder);
22     }
23     override public Root!(T,F) from(T t = null, F owner = null) {
24         super.from(t, owner);
25         _sqlBuidler.update(_root.getTableName());
26         return _root;
27     }
28     //Comparison
29     public CriteriaUpdate!(T,F) where(R)(Comparison!R cond) {
30         return cast(CriteriaUpdate!(T,F))super.where(cond);
31     }
32     //P = Predicate
33     public CriteriaUpdate!(T,F) where(P...)(P predicates) {
34         return cast(CriteriaUpdate!(T,F))super.where(predicates);
35     }
36     public CriteriaUpdate!(T,F) set(P)(EntityFieldInfo field, P p) {
37         _criteriaBuilder.assertType!(P)(field);
38         // logDebug("set value : %s".format(_criteriaBuilder.getDialect().toSqlValue(p)));
39         if(!_criteriaBuilder.getDbOption().isPgsql())
40             _sqlBuidler.set(field.getFullColumn(), p);
41         else
42             _sqlBuidler.set(field.getColumnName(), p);
43         return this;
44     }
45 
46     public CriteriaUpdate!(T,F) set(EntityFieldInfo field) {
47         string fieldName = field.getFieldName();
48         Variant value = field.getColumnFieldData();
49 
50         version(HUNT_ENTITY_DEBUG_MORE) {
51             tracef("EntityFieldInfo: (%s ), ColumnFieldData: (%s, %s)", field.toString(), value, 
52                 field.getColumnFieldData().type);
53         }
54 
55         version(HUNT_ENTITY_DEBUG) {
56             TypeInfo valueTypeInfo = typeid(value.type);
57             tracef("field: %s, isAggregateType: %s, Type: %s", fieldName, field.isAggregateType(), valueTypeInfo);
58         }
59 
60         if(field.isAggregateType()) {
61             version(HUNT_DEBUG) warningf("An aggregate field ignored: %s", fieldName);
62         } else {
63             _sqlBuidler.set(fieldName, field.getColumnName(), field.getTableName(), value);
64 
65             // if(_criteriaBuilder.getDbOption().isPgsql())
66             // {  
67             //     _sqlBuidler.set(field.getColumnName(), value);
68             // }
69             // else
70             // {
71             //     _sqlBuidler.set(field.getFullColumn(), value);
72             // }
73 
74         }
75         return this;
76     }    
77 }