1 ///
2 module dpq.mixins;
3 
4 import dpq.relationproxy;
5 import std.typecons : Nullable;
6 
7 /**
8    Provides static methods for easy access to RelationProxy for the type
9    this is used in. For docs on all the methods see RelationProxy's own
10    docs.
11 
12    Examples:
13    ------------------
14    struct User
15    {
16       mixin RelationMixin;
17 
18       @PK @serial int id;
19       string username;
20       ubyte[] password;
21       int posts;
22    }
23 
24    auto firstUser = User.where(...).first;
25    auto nUpdated = User.where(...).updateAll(["posts": 123]);
26    auto userCount = User.where(...).count;
27    ------------------
28  */
29 mixin template RelationMixin()
30 {
31    alias Type = typeof(this);
32    alias ProxyT = RelationProxy!Type;
33 
34    import dpq.connection : dpqDefaultConnection;
35    import std.typecons : Nullable;
36 
37    @property static ProxyT relationProxy()
38    {
39       return ProxyT(*dpqDefaultConnection);
40    }
41 
42    static ProxyT where(U)(U[string] filters)
43    {
44       return relationProxy.where(filters);
45    }
46 
47    static ProxyT where(U...)(string filter, U params)
48    {
49       return relationProxy.where(filter, params);
50    }
51 
52    static Type find(U)(U param)
53    {
54       return relationProxy.find(param);
55    }
56 
57    static Type findBy(U)(U[string] filters)
58    {
59       return relationProxy.findBy(filters);
60    }
61 
62    static ref Type insert(ref Type record)
63    {
64       return relationProxy.insert(record);
65    }
66 
67    @property static Nullable!Type first()
68    {
69       return relationProxy.first;
70    }
71 
72    @property static Nullable!Type last()
73    {
74       return relationProxy.last;
75    }
76 
77    @property static Type[] all()
78    {
79       return relationProxy.all;
80    }
81 
82    static auto updateAll(U)(U[string] updates)
83    {
84       return relationProxy.updateAll(updates);
85    }
86 
87    static auto updateOne(U, Tpk)(Tpk id, U[string] values)
88    {
89       return relationProxy.update(id, values);
90    }
91 
92    static auto removeOne(Tpk)(Tpk id)
93    {
94       return relationProxy.remove(id);
95    }
96 
97    static bool saveRecord(Type record)
98    {
99       return relationProxy.save(record);
100    }
101 
102    static long count(string col = "*")
103    {
104       return relationProxy.count(col);
105    }
106 }