|
| 1 | +require_relative '../models/analysis' |
| 2 | + |
1 | 3 | module Cdss |
2 | | - module Parsers |
3 | | - # Parses analysis-related data from CDSS API responses into appropriate model objects. |
4 | | - # Handles call analyses, source routes, and route analyses. |
5 | | - module AnalysisParser |
6 | | - extend BaseParser |
| 4 | + module Parsers |
| 5 | + module AnalysisParser |
| 6 | + class << self |
| 7 | + def parse_call_analyses(response, type:) |
| 8 | + parse_collection(response) do |data| |
| 9 | + # Cdss::Models::CallAnalysis.new(build_call_analysis_params(data, type)) |
| 10 | + params = build_call_analysis_params(data, type) |
| 11 | + Cdss::Models::CallAnalysis.new(**params) |
| 12 | + end |
| 13 | + end |
| 14 | + |
| 15 | + def parse_source_routes(response) |
| 16 | + parse_collection(response) do |data| |
| 17 | + params = build_source_route_params(data) |
| 18 | + Cdss::Models::SourceRoute.new(**params) |
| 19 | + end |
| 20 | + end |
| 21 | + |
| 22 | + def parse_route_analyses(response) |
| 23 | + parse_collection(response) do |data| |
| 24 | + Cdss::Models::RouteAnalysis.new(build_route_analysis_params(data)) |
| 25 | + end |
| 26 | + end |
7 | 27 |
|
8 | | - class << self |
9 | | - # Parses call analysis data from API response. |
10 | | - # |
11 | | - # @param response [Hash] The API response containing call analysis data |
12 | | - # @param type [Symbol] The type of analysis (:wdid or :gnis) |
13 | | - # @return [Array<Cdss::Models::CallAnalysis>] Array of call analysis objects |
14 | | - def parse_call_analyses(response, type:) |
15 | | - parse_collection(response) { |data| build_analysis(Cdss::Models::CallAnalysis, data, type) } |
16 | | - end |
| 28 | + private |
17 | 29 |
|
18 | | - # Parses source route data from API response. |
19 | | - # |
20 | | - # @param response [Hash] The API response containing source route data |
21 | | - # @return [Array<Cdss::Models::SourceRoute>] Array of source route objects |
22 | | - def parse_source_routes(response) |
23 | | - parse_collection(response) { |data| build_analysis(Cdss::Models::SourceRoute, data) } |
24 | | - end |
| 30 | + def parse_collection(response) |
| 31 | + return [] unless response && response['ResultList'] |
| 32 | + response['ResultList'].map { |data| yield(data) } |
| 33 | + end |
25 | 34 |
|
26 | | - # Parses route analysis data from API response. |
27 | | - # |
28 | | - # @param response [Hash] The API response containing route analysis data |
29 | | - # @return [Array<Cdss::Models::RouteAnalysis>] Array of route analysis objects |
30 | | - def parse_route_analyses(response) |
31 | | - parse_collection(response) { |data| build_analysis(Cdss::Models::RouteAnalysis, data) } |
32 | | - end |
| 35 | + def parse_timestamp(value) |
| 36 | + return nil if value.nil? || value.to_s.empty? |
| 37 | + DateTime.parse(value) |
| 38 | + rescue |
| 39 | + nil |
| 40 | + end |
33 | 41 |
|
34 | | - private |
| 42 | + def safe_float(value) |
| 43 | + Float(value) rescue nil |
| 44 | + end |
35 | 45 |
|
36 | | - def build_analysis(klass, data, type = nil) |
37 | | - params = case klass |
38 | | - when Cdss::Models::CallAnalysis |
39 | | - build_call_analysis_params(data, type) |
40 | | - when Cdss::Models::SourceRoute |
41 | | - build_source_route_params(data) |
42 | | - when Cdss::Models::RouteAnalysis |
43 | | - build_route_analysis_params(data) |
44 | | - end |
| 46 | + def safe_integer(value) |
| 47 | + Integer(value) rescue nil |
| 48 | + end |
45 | 49 |
|
46 | | - klass.new(**params) |
47 | | - end |
| 50 | + def build_call_analysis_params(data, type) |
| 51 | + return {} unless data |
48 | 52 |
|
49 | | - def build_call_analysis_params(data, type) |
50 | | - params = { |
51 | | - analysis_date: parse_timestamp(data['analysisDate']), |
52 | | - admin_number: safe_float(data['adminNo']), |
53 | | - percent_time_out_of_priority: safe_float(data['percentTimeOutOfPriority']), |
54 | | - downstream_call_wdid: data['downstreamCallWdid'], |
55 | | - downstream_call_right: data['downstreamCallRight'], |
56 | | - downstream_call_stream_mile: safe_float(data['downstreamCallStreamMile']), |
57 | | - downstream_call_admin_number: safe_float(data['downstreamCallAdminNo']), |
58 | | - downstream_call_decreed_amount: safe_float(data['downstreamCallDecreedAmount']), |
59 | | - downstream_call_decreed_unit: data['downstreamCallDecreedUnit'], |
60 | | - downstream_call_appropriation_date: parse_timestamp(data['downstreamCallAppropriationDate']), |
61 | | - downstream_call_status: data['downstreamCallStatus'], |
62 | | - modified: parse_timestamp(data['modified']), |
63 | | - metadata: {} |
64 | | - } |
| 53 | + { |
| 54 | + analysis_date: parse_timestamp(data['analysisDate']), |
| 55 | + wdid: data['analysisWdid'], |
| 56 | + admin_number: safe_float(data['analysisWrAdminNo']), |
| 57 | + percent_time_out_of_priority: safe_float(data['analysisOutOfPriorityPercentOfDay']), |
| 58 | + downstream_call_wdid: data['locationWdid'], |
| 59 | + downstream_call_right: data['priorityStructure'], |
| 60 | + downstream_call_stream_mile: safe_float(data['locationWdidStreamMile']), |
| 61 | + downstream_call_admin_number: safe_float(data['priorityAdminNo']), |
| 62 | + downstream_call_decreed_amount: nil, |
| 63 | + downstream_call_decreed_unit: nil, |
| 64 | + downstream_call_appropriation_date: parse_timestamp(data['priorityDate']), |
| 65 | + downstream_call_status: data['callType'], |
| 66 | + modified: parse_timestamp(data['dateTimeSet']), |
| 67 | + metadata: { |
| 68 | + division: safe_integer(data['division']), |
| 69 | + date_time_released: parse_timestamp(data['dateTimeReleased']), |
| 70 | + water_source_name: data['waterSourceName'], |
| 71 | + location_structure: data['locationStructure'], |
| 72 | + priority_order_no: safe_integer(data['priorityOrderNo']), |
| 73 | + priority_no: data['priorityNo'], |
| 74 | + bounding_wdid: data['boundingWdid'], |
| 75 | + bounding_structure_name: data['boundingStructureName'], |
| 76 | + set_comments: data['setComments'], |
| 77 | + release_comment: data['releaseComment'] |
| 78 | + } |
| 79 | + }.compact |
| 80 | + end |
65 | 81 |
|
66 | | - case type |
67 | | - when :wdid |
68 | | - params[:wdid] = data['wdid'] |
69 | | - when :gnis |
70 | | - params[:gnis_id] = data['gnisId'] |
71 | | - params[:stream_mile] = safe_float(data['streamMile']) |
72 | | - end |
| 82 | + def build_source_route_params(data) |
| 83 | + return {} unless data |
73 | 84 |
|
74 | | - params |
75 | | - end |
| 85 | + { |
| 86 | + gnis_id: data['gnisId'], |
| 87 | + gnis_name: data['gnisName'], |
| 88 | + stream_name: data['streamName'], |
| 89 | + division: safe_integer(data['division']), |
| 90 | + water_district: safe_integer(data['waterDistrict']), |
| 91 | + county: data['county'], |
| 92 | + start_mile: safe_float(data['startMile']), |
| 93 | + end_mile: safe_float(data['endMile']), |
| 94 | + total_length: safe_float(data['totalLength']), |
| 95 | + modified: parse_timestamp(data['modified']), |
| 96 | + metadata: {} |
| 97 | + }.compact |
| 98 | + end |
76 | 99 |
|
77 | | - def build_source_route_params(data) |
78 | | - { |
79 | | - gnis_id: data['gnisId'], |
80 | | - gnis_name: data['gnisName'], |
81 | | - stream_name: data['streamName'], |
82 | | - division: safe_integer(data['division']), |
83 | | - water_district: safe_integer(data['waterDistrict']), |
84 | | - county: data['county'], |
85 | | - start_mile: safe_float(data['startMile']), |
86 | | - end_mile: safe_float(data['endMile']), |
87 | | - total_length: safe_float(data['totalLength']), |
88 | | - modified: parse_timestamp(data['modified']), |
89 | | - metadata: {} |
90 | | - } |
91 | | - end |
| 100 | + def build_route_analysis_params(data) |
| 101 | + return {} unless data |
92 | 102 |
|
93 | | - def build_route_analysis_params(data) |
94 | | - { |
95 | | - wdid: data['wdid'], |
96 | | - structure_name: data['structureName'], |
97 | | - stream_mile: safe_float(data['streamMile']), |
98 | | - structure_type: data['structureType'], |
99 | | - decreed_amount: safe_float(data['decreedAmount']), |
100 | | - decreed_unit: data['decreedUnit'], |
101 | | - appropriation_date: parse_timestamp(data['appropriationDate']), |
102 | | - admin_number: safe_float(data['adminNo']), |
103 | | - modified: parse_timestamp(data['modified']), |
104 | | - metadata: {} |
105 | | - } |
106 | | - end |
107 | | - end |
108 | | - end |
109 | | - end |
| 103 | + { |
| 104 | + wdid: data['wdid'], |
| 105 | + structure_name: data['structureName'], |
| 106 | + stream_mile: safe_float(data['streamMile']), |
| 107 | + structure_type: data['structureType'], |
| 108 | + decreed_amount: safe_float(data['decreedAmount']), |
| 109 | + decreed_unit: data['decreedUnit'], |
| 110 | + appropriation_date: parse_timestamp(data['appropriationDate']), |
| 111 | + admin_number: safe_float(data['adminNo']), |
| 112 | + modified: parse_timestamp(data['modified']), |
| 113 | + metadata: {} |
| 114 | + }.compact |
| 115 | + end |
| 116 | + end |
| 117 | + end |
| 118 | + end |
110 | 119 | end |
0 commit comments