@@ -23,27 +23,21 @@ defmodule Astarte.AppEngine.API.Device.Queries do
2323 alias Astarte.AppEngine.API.Device.DeletionInProgress
2424 alias Astarte.AppEngine.API.Device.DeviceStatus
2525 alias Astarte.AppEngine.API.Device.DevicesList
26- alias Astarte.AppEngine.API.Device.InterfaceValuesOptions
2726 alias Astarte.AppEngine.API.Device.InterfaceInfo
27+ alias Astarte.AppEngine.API.Realms.IndividualProperty
2828 alias Astarte.AppEngine.API.KvStore
2929 alias Astarte.AppEngine.API.Name
3030 alias Astarte.AppEngine.API.Repo
3131 alias Astarte.Core.CQLUtils
3232 alias Astarte.Core.Device
3333 alias Astarte.Core.InterfaceDescriptor
34- alias CQEx.Query , as: DatabaseQuery
35- alias CQEx.Result , as: DatabaseResult
3634 alias Astarte.AppEngine.API.Realm
3735 alias Astarte.AppEngine.API.Devices.Device , as: DatabaseDevice
3836 alias Astarte.AppEngine.API.Endpoint , as: DatabaseEndpoint
3937
4038 require CQEx
4139 require Logger
4240
43- def first_result_row ( values ) do
44- DatabaseResult . head ( values )
45- end
46-
4741 def retrieve_interfaces_list ( realm_name , device_id ) do
4842 keyspace = keyspace_name ( realm_name )
4943
@@ -165,17 +159,8 @@ defmodule Astarte.AppEngine.API.Device.Queries do
165159 |> Repo . all ( )
166160 end
167161
168- defp get_ttl_string ( opts ) do
169- with { :ok , value } when is_integer ( value ) <- Keyword . fetch ( opts , :ttl ) do
170- "USING TTL #{ to_string ( value ) } "
171- else
172- _any_error ->
173- ""
174- end
175- end
176-
177162 def insert_path_into_db (
178- db_client ,
163+ realm_name ,
179164 device_id ,
180165 % InterfaceDescriptor { storage_type: storage_type } = interface_descriptor ,
181166 endpoint_id ,
@@ -191,30 +176,25 @@ defmodule Astarte.AppEngine.API.Device.Queries do
191176 # TODO: use received value_timestamp when needed
192177 # TODO: :reception_timestamp_submillis is just a place holder right now
193178
194- ttl_string = get_ttl_string ( opts )
179+ keyspace = keyspace_name ( realm_name )
195180
196- insert_statement = """
197- INSERT INTO individual_properties
198- (device_id, interface_id, endpoint_id, path,
199- reception_timestamp, reception_timestamp_submillis, datetime_value)
200- VALUES (:device_id, :interface_id, :endpoint_id, :path, :reception_timestamp,
201- :reception_timestamp_submillis, :datetime_value) #{ ttl_string } ;
202- """
181+ # Ecto expects microsecond precision
182+ { reception , reception_submillis } = split_datetime_to_ms_and_submillis ( reception_timestamp )
183+ value_timestamp = value_timestamp |> DateTime . truncate ( :millisecond ) |> pad_usec ( )
203184
204- { reception_ms , reception_submillis } = split_ms_and_submillis ( reception_timestamp )
185+ value = % IndividualProperty {
186+ device_id: device_id ,
187+ interface_id: interface_descriptor . interface_id ,
188+ endpoint_id: endpoint_id ,
189+ path: path ,
190+ reception_timestamp: reception ,
191+ reception_timestamp_submillis: reception_submillis ,
192+ datetime_value: value_timestamp
193+ }
205194
206- insert_query =
207- DatabaseQuery . new ( )
208- |> DatabaseQuery . statement ( insert_statement )
209- |> DatabaseQuery . put ( :device_id , device_id )
210- |> DatabaseQuery . put ( :interface_id , interface_descriptor . interface_id )
211- |> DatabaseQuery . put ( :endpoint_id , endpoint_id )
212- |> DatabaseQuery . put ( :path , path )
213- |> DatabaseQuery . put ( :reception_timestamp , reception_ms )
214- |> DatabaseQuery . put ( :reception_timestamp_submillis , reception_submillis )
215- |> DatabaseQuery . put ( :datetime_value , value_timestamp )
195+ ttl = opts [ :ttl ]
216196
217- DatabaseQuery . call! ( db_client , insert_query )
197+ Repo . insert! ( value , prefix: keyspace , ttl: ttl )
218198
219199 :ok
220200 end
@@ -723,28 +703,6 @@ defmodule Astarte.AppEngine.API.Device.Queries do
723703 { count , values }
724704 end
725705
726- def get_results_count ( _client , _count_query , % InterfaceValuesOptions { downsample_to: nil } ) do
727- # Count will be ignored since there's no downsample_to
728- nil
729- end
730-
731- def get_results_count ( client , count_query , opts ) do
732- with { :ok , result } <- DatabaseQuery . call ( client , count_query ) ,
733- [ { _count_key , count } ] <- DatabaseResult . head ( result ) do
734- limit = opts . limit || Config . max_results_limit! ( )
735-
736- min ( count , limit )
737- else
738- error ->
739- _ =
740- Logger . warning ( "Can't retrieve count for #{ inspect ( count_query ) } : #{ inspect ( error ) } ." ,
741- tag: "db_error"
742- )
743-
744- nil
745- end
746- end
747-
748706 def all_properties_for_endpoint! (
749707 realm_name ,
750708 device_id ,
@@ -1036,4 +994,22 @@ defmodule Astarte.AppEngine.API.Device.Queries do
1036994
1037995 { timestamp_ms , timestamp_submillis }
1038996 end
997+
998+ defp split_datetime_to_ms_and_submillis ( datetime ) do
999+ datetime_ms = datetime |> DateTime . truncate ( :millisecond ) |> pad_usec ( )
1000+
1001+ { usec , _ } = datetime . microsecond
1002+ submillis = usec |> rem ( 1000 )
1003+
1004+ { datetime_ms , submillis }
1005+ end
1006+
1007+ defp pad_usec ( nil ) , do: nil
1008+
1009+ defp pad_usec ( timestamp ) do
1010+ case timestamp . microsecond do
1011+ { _ , 6 } -> timestamp
1012+ { usec , _ } -> % { timestamp | microsecond: { usec , 6 } }
1013+ end
1014+ end
10391015end
0 commit comments