@@ -9,7 +9,7 @@ require "./query_logger"
99#
1010# ```
1111# logger = Core::QueryLogger.new(STDOUT)
12- # repo = Core::Repository(User) .new(db, logger)
12+ # repo = Core::Repository.new(db, logger)
1313#
1414# user = User.new(name: "Foo")
1515# repo.insert(user) # TODO: [RFC] Return last inserted ID
@@ -30,7 +30,7 @@ require "./query_logger"
3030# # DELETE FROM users WHERE id = $1
3131# # 1.628ms
3232# ```
33- class Core::Repository ( ModelType )
33+ class Core::Repository
3434 # :nodoc:
3535 property db
3636 # :nodoc:
@@ -44,23 +44,33 @@ class Core::Repository(ModelType)
4444 def initialize (@db : DB ::Database , @query_logger : QueryLogger )
4545 end
4646
47- # Issue a query to the `#db`. Returns an array of `Model` instances.
47+ # Query `#db` returning an array of *model* instances.
48+ #
49+ # ```
50+ # repo.query(User, "SELECT * FROM users") # => Array(User)
51+ # ```
4852 #
4953 # TODO: Handle errors (PQ::PQError)
50- def query (query : String , * params) : Array ( ModelType )
54+ def query (model : Model .class, query : String , * params) : Array
5155 query = prepare_query(query)
5256 params = prepare_params(* params) if params.any?
5357
5458 query_logger.wrap(query) do
5559 db.query_all(query, * params) do |rs |
56- rs.read(ModelType )
60+ rs.read(model )
5761 end
5862 end
5963 end
6064
61- # ditto
62- def query (query : Query )
63- query(query.to_s, query.params)
65+ # Query `#db` returning an array of model instances inherited from *query*.
66+ #
67+ # ```
68+ # repo.query(Query(User).all) # => Array(User)
69+ # ```
70+ #
71+ # TODO: Handle errors (PQ::PQError)
72+ def query (query : Query (T )) forall T
73+ query(T , query.to_s, query.params)
6474 end
6575
6676 private SQL_INSERT = <<-SQL
@@ -75,19 +85,19 @@ class Core::Repository(ModelType)
7585 # TODO: Handle errors.
7686 # TODO: Multiple inserts.
7787 # TODO: [RFC] Call `#query` and return `Model` instance instead (see https://github.com/will/crystal-pg/issues/101).
78- def insert (instance : ModelType ) : Int64
88+ def insert (instance : Model ) : Int64
7989 fields = instance.db_fields.dup.tap do |f |
8090 f.each do |k , _ |
81- f[k] = now if ModelType .created_at_fields.includes?(k) && f[k].nil?
82- f.delete(k) if k == ModelType .primary_key
91+ f[k] = now if instance.class .created_at_fields.includes?(k) && f[k].nil?
92+ f.delete(k) if k == instance.class .primary_key
8393 end
8494 end
8595
8696 query = SQL_INSERT % {
87- table_name: ModelType .table_name,
97+ table_name: instance.class .table_name,
8898 keys: fields.keys.join(" , " ),
8999 values: (1 ..fields.size).map { " ?" }.join(" , " ),
90- returning: ModelType .primary_key,
100+ returning: instance.class .primary_key,
91101 }
92102
93103 query = prepare_query(query)
@@ -111,22 +121,22 @@ class Core::Repository(ModelType)
111121 # TODO: Handle errors.
112122 # TODO: Multiple updates.
113123 # TODO: [RFC] Call `#query` and return `Model` instance instead (see https://github.com/will/crystal-pg/issues/101).
114- def update (instance : ModelType )
124+ def update (instance : Model )
115125 fields = instance.db_fields.select do |k , _ |
116126 instance.changes.keys.includes?(k)
117127 end .tap do |f |
118128 f.each do |k , _ |
119- f[k] = now if ModelType .updated_at_fields.includes?(k)
129+ f[k] = now if instance.class .updated_at_fields.includes?(k)
120130 end
121131 end
122132
123133 return unless fields.any?
124134
125135 query = SQL_UPDATE % {
126- table_name: ModelType .table_name,
136+ table_name: instance.class .table_name,
127137 set_fields: fields.keys.map { |k | k.to_s + " = ?" }.join(" , " ),
128- primary_key: ModelType .primary_key, # TODO: Handle empty primary key
129- returning: ModelType .primary_key,
138+ primary_key: instance.class .primary_key, # TODO: Handle empty primary key
139+ returning: instance.class .primary_key,
130140 }
131141
132142 query = prepare_query(query)
@@ -146,10 +156,10 @@ class Core::Repository(ModelType)
146156 #
147157 # TODO: Handle errors.
148158 # TODO: Multiple deletes.
149- def delete (instance : ModelType )
159+ def delete (instance : Model )
150160 query = SQL_DELETE % {
151- table_name: ModelType .table_name,
152- primary_key: ModelType .primary_key,
161+ table_name: instance.class .table_name,
162+ primary_key: instance.class .primary_key,
153163 }
154164
155165 query = prepare_query(query)
0 commit comments