Weather Control (TimeSeries) consists of a dashboard that shows weather for different pre-registered cities. The information will be updated every 10 minutes using a table with a TimeSeries row.

1 Data model

The following sections will follow the displayed data model in order to create the application and its transaction forms, graphs and lists.

In this data model, we can see a vitrual copy of our main table owm_cities_data_hist_ts, which will allow us easy access to insert, update and delete the values stored in the TimeSeries row of owm_cities_data_hist_ts.

We also have a cities table, owm_cities, where the main information of the cities wanted for the weather cast will be found. Specially the city_id, which is given by Open Weather Map in this file here.

The table owm_apikey, stores the information of the API where we will direct our requests. This API only allows 60 requests per hour using the given key. If the key gets outdated it can be modified by a new one. To get a new key, access the Open Weather Map to get more information about how it.

2 Tables

2.1 Cities

The table owm_cities stores the city identification number given by Open Weather Map, its name, coordinates and country.

Copy
<table name='owm_cities'>

    <!-- COLUMNS -->
    <column name='city_id'                          type='int'          size='10'                   required='y'        info='City id'/>
    <column name='city_name'                        type='char'         size='50'                                       info='Name of the city'/>  
    <column name='city_coord_lon'                   type='decimal'      size='14,10'                required='y'        info='City coordinates longitude'/>
    <column name='city_coord_lat'                   type='decimal'      size='14,10'                required='y'        info='City coordinates latitude'/>
    <column name='city_country'                     type='char'         size='2'                                        info='Country of the city'/>
    
    <!-- INDEXES -->
    <primary name='p_owm_cities1' columns='city_id'         />

  </table>
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:12:48 CEST 2019 Engine: informix
-- owm_cities
-- **************************************************************************
CREATE TABLE owm_cities (
    city_id int not null,
    city_name char(50),
    city_coord_lon decimal(14,10) not null,
    city_coord_lat decimal(14,10) not null,
    city_country char(2)
);
ALTER TABLE owm_cities LOCK MODE (ROW);

-- Index to avoid automatic named by database (named with pk name).
CREATE UNIQUE INDEX p_owm_cities1 ON owm_cities(city_id);
ALTER TABLE owm_cities
 ADD CONSTRAINT 
 PRIMARY KEY (city_id)
 CONSTRAINT p_owm_cities1;
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:13:01 CEST 2019 Engine: postgres
-- owm_cities
-- **************************************************************************
CREATE TABLE owm_cities (
    city_id int not null,
    city_name varchar(50),
    city_coord_lon decimal(14,10) not null,
    city_coord_lat decimal(14,10) not null,
    city_country varchar(2)
) WITH OIDS;

-- Database Server on Postgres, DB2 will be created a index automatically with the same name of pk
ALTER TABLE owm_cities
 ADD CONSTRAINT p_owm_cities1
 PRIMARY KEY (city_id);
Cities: owm_cities
Column Type Details Definition
city_id integer Primary key. City identifier given by the host.
city_name char City name.
city_coord_lat decimal City latitude's coordinates.
city_coord_lon decimal City longitude's coordinates.
city_country char Country of the city, acronym.

2.2 API

The table owm_apikey stores the information about the API, such as the host and the API key.

Copy
<table name='owm_apikey'>

    <!-- COLUMNS -->
    <column name='linid'            type='serial'                                                   required='y'        info='Line id'              />
    <column name='host'             type='char'         size='50'                                                       info='Website URL'          />  
    <column name='apikey'           type='char'         size='50'                                required='y'        info='API key for website'  />
    
    <column name='user_created'  	type='char' 		size='20' 				default='user' 		required='y'                                    />
    <column name='date_created'  	type='datetime' 	size='year to second' 	default='current' 	required='y'                                    />
    <column name='user_updated'  	type='char' 		size='20' 				default='user' 		required='y'                                    />
    <column name='date_updated'  	type='datetime' 	size='year to second' 	default='current' 	required='y'                                    />
    
    <!-- INDEXES -->
    <primary name='p_owm_apikey1' columns='linid'         />

  </table>
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:24:12 CEST 2019 Engine: informix
-- owm_apikey
-- **************************************************************************
CREATE TABLE owm_apikey (
    linid serial not null,
    host char(50),
    apikey char(50) not null,
    user_created char(20) default user not null,
    date_created datetime year to second default current year to second not null,
    user_updated char(20) default user not null,
    date_updated datetime year to second default current year to second not null
);
ALTER TABLE owm_apikey LOCK MODE (ROW);

-- Index to avoid automatic named by database (named with pk name).
CREATE UNIQUE INDEX p_owm_apikey1 ON owm_apikey(linid);
ALTER TABLE owm_apikey
 ADD CONSTRAINT 
 PRIMARY KEY (linid)
 CONSTRAINT p_owm_apikey1;
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:24:22 CEST 2019 Engine: postgres
-- owm_apikey
-- **************************************************************************
CREATE TABLE owm_apikey (
    linid serial not null,
    host varchar(50),
    apikey varchar(50) not null,
    user_created varchar(20) default user not null,
    date_created timestamp default CURRENT_TIMESTAMP not null,
    user_updated varchar(20) default user not null,
    date_updated timestamp default CURRENT_TIMESTAMP not null
) WITH OIDS;

-- Database Server on Postgres, DB2 will be created a index automatically with the same name of pk
ALTER TABLE owm_apikey
 ADD CONSTRAINT p_owm_apikey1
 PRIMARY KEY (linid);
API: owm_apikey
Column Type Details Definition
linid serial Primary key. Line identifier.
host char Host URL.
apikey char API key.
user_created char User created.
date_created datetime Date created.
user_updated char User updated.
date_updated datetime Date updated.

2.3 Icons

The table owm_weather_icons stores the images used to represent weather phenomena, those icons are obtained from OpenWeatherMap.

Copy
<table name='owm_weather_icons'>
	<column name='img_id'		type='serial'					required='y' 	info='Identifier'/>
	<column name='img_name'		type='varchar'		size='40' 	             	info='Name'/>
	
	<column name='img_type'  type='varchar' size='40'               />
    <column name='img_size'  type='int'                             />
    <column name='img_data'  type='blob'                            />
    
	<!-- PRIMARY -->
	<primary name='p_owm_weather_icons' 	columns='img_id' />

</table>
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 08 10:01:50 CEST 2019 Engine: informix
-- owm_weather_icons
-- **************************************************************************
CREATE TABLE owm_weather_icons (
    img_id serial not null,
    img_name varchar(40),
    img_type varchar(40),
    img_size int,
    img_data blob
);
ALTER TABLE owm_weather_icons LOCK MODE (ROW);

-- Index to avoid automatic named by database (named with pk name).
CREATE UNIQUE INDEX p_owm_weather_icons ON owm_weather_icons(img_id);
ALTER TABLE owm_weather_icons
 ADD CONSTRAINT 
 PRIMARY KEY (img_id)
 CONSTRAINT p_owm_weather_icons;
API: owm_weather_icons
Column Type Details Definition
img_id serial Primary key. Image identifier.
img_name varchar Image name.
img_type varchar Image type.
img_size int Image size.
img_data blob Image.

2.4 Data

The table owm_cities_data_hist_ts stores the city identifier and the data given by the api response. For easier access to the timeseries row, a virtual table, owm_cities_data_hist_ts, is created in ordrer to visualize all the columns.

Copy
<table name='owm_cities_data_hist_ts'>

    <!-- COLUMNS -->
    <column name='city_id'                          type='int'                             required='y'        info='City id'/>

    <tseries
        rowtype_name='rowtype_owm_cities_data'
        pattern_name='patt_10min'
        pattern_on='1'
        pattern_off='599'
        pattern_unit='second'
        calendar_name='cal_10min_2019'
        calendar_start='2019-01-01 00:00:00'
        container_name='container_owm_cities_data'
        container_dbspace='d_data'
        column_name='owm_data'
        view_name='owm_cities_data_hist_ts_vti'
    >
        
        <column name='date_received'                    type='datetime'     size='year to fraction(5)'   default='current'  info='Data received date'/>
        <column name='city_sun_rise'                    type='datetime'     size='year to second'                           info='Time of city sunrise'/>
        <column name='city_sun_set'                     type='datetime'     size='year to second'                           info='Time of city sunset'/>
        <column name='temperature_value'                type='decimal'      size='4,2'                                      info='Current temperature'/>
        <column name='temperature_min'                  type='decimal'      size='4,2'                                      info='Minimum temperature'/>
        <column name='temperature_max'                  type='decimal'      size='4,2'                                      info='Maximum temperature'/>
        <column name='temperature_unit'                 type='char'         size='12'                                       info='Units format'/>
        <column name='humidity_value'                   type='int'                                                          info='Current humidity'/>
        <column name='humidity_unit'                    type='char'         size='12'                                       info='Units format'/>
        <column name='pressure_value'                   type='int'                                                          info='Current pressure'/>
        <column name='pressure_unit'                    type='char'         size='12'                                       info='Units format'/>
        <column name='wind_speed_value'                 type='decimal'      size='10,2'                                     info='Current wind speed'/>
        <column name='wind_speed_name'                  type='char'         size='50'                                       info='Wind description'/>
        <!-- Wind gusts don't usually appear on the data load and we don't know how they are represented, although they can be included in the fututre.-->
        <!-- <column name='wind_gusts'                       type=' '            size=' '                                           info='Wind gusts'/> -->
        <column name='wind_direction_value'             type='int'                                                          info='Wind direction in degrees'/>
        <column name='wind_direction_code'              type='char'         size='4'                                        info='Wind direction code'/>
        <column name='wind_direction_name'              type='char'         size='12'                                       info='Wind direction description'/>
        <column name='clouds_value'                     type='int'                                                          info='Cloudiness percentage'/>
        <column name='clouds_name'                      type='char'         size='20'                                       info='Cloudiness description'/>
        <column name='visibility_value'                 type='int'                                                          info='Current visibility'/>
        <column name='precipitation_value'              type='decimal'      size='6,2'                                      info='Current precipitation'/>
        <column name='precipitation_mode'               type='char'         size='10'                                       info='Precipitation marker'/>
        <column name='precipitation_unit'               type='char'         size='12'                                       info='Units format'/>
        <column name='lastupdate_value'                 type='datetime'     size='year to second'                           info='Last updated'/>
        
    </tseries>

    <!-- INDEXES -->
    <index name='i_owm_cities_data_hist_ts1' columns='city_id'         />

    <!-- FOREIGNS -->
    <foreign name='f_owm_cities_data_hist_ts1' columns='city_id'   references='owm_cities'  refcols='city_id' ondeletecascade='y' />
</table>
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:39:37 CEST 2019 Engine: informix
-- owm_cities_data_hist_ts
-- **************************************************************************
INSERT INTO CalendarPatterns VALUES ('patt_10min', '{1 on, 599 off}, second');
INSERT INTO CalendarTable (c_name, c_calendar) VALUES ('cal_10min_2019', 'startdate(2019-01-01 00:00:00), pattstart(2019-01-01 00:00:00), pattname(patt_10min)');
CREATE ROW TYPE rowtype_owm_cities_data(
    date_received datetime year to fraction(5),
    city_sun_rise datetime year to second,
    city_sun_set datetime year to second,
    temperature_value decimal(4,2),
    temperature_min decimal(4,2),
    temperature_max decimal(4,2),
    temperature_unit char(12),
    humidity_value int,
    humidity_unit char(12),
    pressure_value int,
    pressure_unit char(12),
    wind_speed_value decimal(10,2),
    wind_speed_name char(50),
    wind_direction_value int,
    wind_direction_code char(4),
    wind_direction_name char(12),
    clouds_value int,
    clouds_name char(20),
    visibility_value int,
    precipitation_value decimal(6,2),
    precipitation_mode char(10),
    precipitation_unit char(12),
    lastupdate_value datetime year to second
);
EXECUTE PROCEDURE TSContainerCreate ('container_owm_cities_data', 'd_data', 'rowtype_owm_cities_data', 0, 0);

CREATE TABLE owm_cities_data_hist_ts (
    city_id int not null
    ,owm_data TimeSeries(rowtype_owm_cities_data)
);
ALTER TABLE owm_cities_data_hist_ts LOCK MODE (ROW);

EXECUTE PROCEDURE tscreatevirtualtab('owm_cities_data_hist_ts_vti','owm_cities_data_hist_ts');

CREATE INDEX i_owm_cities_data_hist_ts1
 ON owm_cities_data_hist_ts(city_id);

-- Omitido indice f_owm_cities_data_hist_ts1 dado que ya existe un indice sobre las columnas 
ALTER TABLE owm_cities_data_hist_ts
 ADD CONSTRAINT  FOREIGN KEY (city_id)
 REFERENCES owm_cities(city_id)
 ON DELETE CASCADE 
 CONSTRAINT f_owm_cities_data_hist_ts1;
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:39:46 CEST 2019 Engine: postgres
-- owm_cities_data_hist_ts
-- **************************************************************************
CREATE TABLE owm_cities_data_hist_ts (
    city_id int not null
) WITH OIDS;

CREATE INDEX i_owm_cities_data_hist_ts1
 ON owm_cities_data_hist_ts(city_id);

-- Omitido indice f_owm_cities_data_hist_ts1 dado que ya existe un indice sobre las columnas 
ALTER TABLE owm_cities_data_hist_ts
 ADD CONSTRAINT f_owm_cities_data_hist_ts1 FOREIGN KEY (city_id)
 REFERENCES owm_cities(city_id)
 ON DELETE CASCADE  DEFERRABLE INITIALLY IMMEDIATE ;
Data: owm_cities_data_hist_ts
Column Type Details Definition
city_id integer Primary key. City identifier given by the host.
owm_data row type timeseries Weather data.

If trouble appears when inserting rows into this table, such as a no permission exception, execute using the name of the created rowtype and specifying the group of users 'public' the following command: GRANT USAGE ON TYPE rowtype_owm_cities_data TO public

Virtual Data: owm_cities_data_hist_ts_vti
Column Type Details Definition
city_id integer Primary key. City identifier given by the host.
date_received datetime year to fraction(5) This column must ALWAYS be the first one defined in the row type. If the first column of the rowtipe is not a datetime year to fraction(5) it will trigger an exception.
Default is set to CURRENT.
Datetime of the received api response.
city_sun_rise datetime year to second Sunrise time.
city_sun_set datetime year to second Sunset time.
temperature_value decimal Current temperature.
temperature_min decimal Minimum temperature.
temperature_max decimal Maximum temperature.
temperature_unit char Units format.
humidity_value decimal Current humidity.
humidity_unit char Units format.
pressure_value decimal Current pressure.
pressure_unit char Units format.
wind_speed_value decimal Current wind speed.
wind_speed_name char Wind description.
wind_direction_value decimal Wind direction degrees.
wind_direction_code char Wind direction abreviation.
wind_direction_name char Wind direction description.
clouds_value decimal Cloudiness percentage.
clouds_name char Cloudiness description.
visibility_value decimal Current visibility.
precipitation_value decimal Current precipitation.
precipitation_mode char Precipitation marker.
precipitation_unit char Units format.
lastupdated_value datetime year to second Last weather updated.

This view shows the values given by owm_cities_data_hist_ts_vti, owm_cities and owm_weather_icons and combined values from those tables in order to have easy access to more human readable information to show in lists and graphs.

Copy
<view name='owm_cities_data_v'>
    <columns>
        city_id,
        location_name,
        city_name,
        city_country,
        date_received,
        datetime_received,
        city_sun_rise,
        city_sun_set,
        weather_description,
        weather_icon_id,
        weather_icon_name,
        weather_icon_data,
        weather_icon_size,
        weather_icon_type,
        temperature_value_u,
        temperature_min_u,
        temperature_max_u,
        temperature_value,
        temperature_unit_short, 
        temperature_min,
        temperature_max,
        temperature_unit,
        humidity_u,
        humidity_value,
        humidity_unit,
        pressure_u,
        pressure_value,
        pressure_unit,
        wind_u,
        wind_speed_u,
        wind_speed_value_u,
        wind_0,
        wind_E,
        wind_ENE,
        wind_ESE,
        wind_N,
        wind_NE,
        wind_NNE,
        wind_NNW,
        wind_NW,
        wind_S,
        wind_SE,
        wind_SSE,
        wind_SSW,
        wind_SW,
        wind_W,
        wind_WNW,
        wind_WSW,
        wind_speed_value,
        wind_speed_name,
        wind_speed_unit,
        wind_direction_u,
        wind_direction_value_u,
        wind_direction_value,
        wind_direction_unit,
        wind_direction_code,
        wind_direction_name,
        clouds_u,
        clouds_value,
        clouds_unit,
        clouds_name,
        visibility_u,
        visibility_value,
        visibility_unit,
        precipitation_mode,
        precipitation_description,
        precipitation_u,
        precipitation_value_10min,
        precipitation_value,
        precipitation_unit_time,
        precipitation_unit,
        lastupdate_value
    </columns>
    <select>
        <columns>
            owm_cities.city_id,
            (owm_cities.city_name || ', ' || owm_cities.city_country) <alias name='location_name'/>,
            city_name,
            city_country,
            DATE(date_received) <alias name='date_received'/>,
            date_received <alias name='datetime_received'/>,
            city_sun_rise,
            city_sun_set,
            (owm_cities_data_hist_ts_vti.clouds_name || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE ' - ' END) || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE owm_cities_data_hist_ts_vti.precipitation_mode END) ) <alias name='weather_description'/>,
            (SELECT img_id 
            FROM owm_weather_icons
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END)) <alias name='weather_icon_id'/>,
            (SELECT img_name 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END)) <alias name='weather_icon_name'/>,
            (SELECT img_data 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END)) <alias name='weather_icon_data'/>,
            (SELECT img_size 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END)) <alias name='weather_icon_size'/>,
            (SELECT img_type 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END)) <alias name='weather_icon_type'/>,
            (temperature_value || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_value_u'/>,
            (temperature_min || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_min_u'/>,
            (temperature_max || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_max_u'/>,
            temperature_value,
            (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) <alias name='temperature_unit_short'/>, 
            temperature_min,
            temperature_max,
            temperature_unit,
            (owm_cities_data_hist_ts_vti.humidity_value || ' ' || owm_cities_data_hist_ts_vti.humidity_unit) <alias name='humidity_u'/>,
            humidity_value,
            humidity_unit,
            (owm_cities_data_hist_ts_vti.pressure_value || ' ' || owm_cities_data_hist_ts_vti.pressure_unit) <alias name='pressure_u'/>,
            pressure_value,
            pressure_unit,
            (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s) | ' || owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) <alias name='wind_u'/>,
            (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s)') <alias name='wind_speed_u'/>,
            (owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s') <alias name='wind_speed_value_u'/>,
            (CASE WHEN wind_direction_value = '0'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_0'/>,
            (CASE WHEN wind_direction_code = 'E'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_E'/>,
            (CASE WHEN wind_direction_code = 'ENE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_ENE'/>,
            (CASE WHEN wind_direction_code = 'ESE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_ESE'/>,
            (CASE WHEN wind_direction_code = 'N'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_N'/>,
            (CASE WHEN wind_direction_code = 'NE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_NE'/>,
            (CASE WHEN wind_direction_code = 'NNE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_NNE'/>,
            (CASE WHEN wind_direction_code = 'NNW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_NNW'/>,
            (CASE WHEN wind_direction_code = 'NW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_NW'/>,
            (CASE WHEN wind_direction_code = 'S'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_S'/>,
            (CASE WHEN wind_direction_code = 'SE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_SE'/>,
            (CASE WHEN wind_direction_code = 'SSE'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_SSE'/>,
            (CASE WHEN wind_direction_code = 'SSW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_SSW'/>,
            (CASE WHEN wind_direction_code = 'SW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_SW'/>,
            (CASE WHEN wind_direction_code = 'W'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_W'/>,
            (CASE WHEN wind_direction_code = 'WNW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_WNW'/>,
            (CASE WHEN wind_direction_code = 'WSW'
                THEN wind_speed_value
                ELSE 0
                END) <alias name='wind_WSW'/>,
            wind_speed_value,
            wind_speed_name,
            'm/s' <alias name='wind_speed_unit'/>,
            (owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) <alias name='wind_direction_u'/>,
            (owm_cities_data_hist_ts_vti.wind_direction_value || 'º') <alias name='wind_direction_value_u'/>,
            wind_direction_value,
            ' º' <alias name='wind_direction_unit'/>,
            wind_direction_code,
            wind_direction_name,
            (clouds_name || ' (' || clouds_value || '%)') <alias name='clouds_u'/>,
            clouds_value,
            '%' <alias name='clouds_unit'/>,
            clouds_name,
            (owm_cities_data_hist_ts_vti.visibility_value || ' m') <alias name='visibility_u'/>,
            visibility_value,
            'm' <alias name='visibility_unit'/>,
            precipitation_mode,
            CASE WHEN precipitation_mode == 'no' 
                THEN '-'
                ELSE (precipitation_mode || ' | ' || owm_cities_data_hist_ts_vti.precipitation_value || ' mm    - ' || owm_cities_data_hist_ts_vti.precipitation_unit)
                END <alias name='precipitation_description'/>,
            (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode == 'no'
                THEN '-'
                ELSE (owm_cities_data_hist_ts_vti.precipitation_value || ' mm    - ' || owm_cities_data_hist_ts_vti.precipitation_unit)
                END) <alias name='precipitation_u'/>,
            owm_cities_data_hist_ts_vti.precipitation_value/(CASE WHEN LENGTH(owm_cities_data_hist_ts_vti.precipitation_unit) &lt; 2 
                THEN 1
                ELSE (to_number(substr(owm_cities_data_hist_ts_vti.precipitation_unit,0,1))*6)
                END) <alias name='precipitation_value_10min'/>,
            precipitation_value,
            precipitation_unit <alias name='precipitation_unit_time'/>,
            'mm' <alias name='precipitation_unit'/>,
            lastupdate_value
        </columns>
        <from table='owm_cities_data_hist_ts_vti'>
            <join table='owm_cities'>
                <on>owm_cities.city_id = owm_cities_data_hist_ts_vti.city_id</on>
            </join>
        </from>
    </select>
</view>
Copy
-- **************************************************************************
-- DEISTER WebStudio XSQL-SCHEMA Mon Aug 12 09:14:33 CEST 2019 Engine: informix
-- owm_cities_data_v
-- **************************************************************************
CREATE VIEW owm_cities_data_v(
        city_id,
        location_name,
        city_name,
        city_country,
        date_received,
        datetime_received,
        city_sun_rise,
        city_sun_set,
        weather_description,
        weather_icon_id,
        weather_icon_name,
        weather_icon_data,
        weather_icon_size,
        weather_icon_type,
        temperature_value_u,
        temperature_min_u,
        temperature_max_u,
        temperature_value,
        temperature_unit_short, 
        temperature_min,
        temperature_max,
        temperature_unit,
        humidity_u,
        humidity_value,
        humidity_unit,
        pressure_u,
        pressure_value,
        pressure_unit,
        wind_u,
        wind_speed_u,
        wind_speed_value_u,
        wind_0,
        wind_E,
        wind_ENE,
        wind_ESE,
        wind_N,
        wind_NE,
        wind_NNE,
        wind_NNW,
        wind_NW,
        wind_S,
        wind_SE,
        wind_SSE,
        wind_SSW,
        wind_SW,
        wind_W,
        wind_WNW,
        wind_WSW,
        wind_speed_value,
        wind_speed_name,
        wind_speed_unit,
        wind_direction_u,
        wind_direction_value_u,
        wind_direction_value,
        wind_direction_unit,
        wind_direction_code,
        wind_direction_name,
        clouds_u,
        clouds_value,
        clouds_unit,
        clouds_name,
        visibility_u,
        visibility_value,
        visibility_unit,
        precipitation_mode,
        precipitation_description,
        precipitation_u,
        precipitation_value_10min,
        precipitation_value,
        precipitation_unit_time,
        precipitation_unit,
        lastupdate_value
    ) AS 
    
    SELECT 
            owm_cities.city_id,
            (owm_cities.city_name || ', ' || owm_cities.city_country)  location_name,
            city_name,
            city_country,
            DATE(date_received)  date_received,
            date_received  datetime_received,
            city_sun_rise,
            city_sun_set,
            (owm_cities_data_hist_ts_vti.clouds_name || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE ' - ' END) || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE owm_cities_data_hist_ts_vti.precipitation_mode END) )  weather_description,
            (SELECT img_id 
            FROM owm_weather_icons
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END))  weather_icon_id,
            (SELECT img_name 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END))  weather_icon_name,
            (SELECT img_data 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END))  weather_icon_data,
            (SELECT img_size 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END))  weather_icon_size,
            (SELECT img_type 
            FROM owm_weather_icons 
            WHERE img_name = (CASE	WHEN  clouds_name = 'clear sky' AND precipitation_mode = 'no'
                    				THEN '01d'
                    				ELSE	CASE    WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no'
                                                    THEN '02d'  
                                                    ELSE    CASE    WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no'
                                                                    THEN '03d'
                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no'
                                                                                    THEN '04d'
                                                                                    ELSE    CASE    WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain'
                                                                                                    THEN '10d'
                                                                                                    ELSE    CASE    WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain'
                                                                                                                    THEN '09d'
                                                                                                                    ELSE    CASE    WHEN precipitation_mode = 'snow'
                                                                                                                                    THEN '13d'
                                                                                                                                    ELSE '01n'
                                                                                                                                    END
                                                                                                                    END
                                                                                                    END
                                                                                    END
                                                                    END
                                                    END
                                    END))  weather_icon_type,
            (temperature_value || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) )  temperature_value_u,
            (temperature_min || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) )  temperature_min_u,
            (temperature_max || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) )  temperature_max_u,
            temperature_value,
            (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END)  temperature_unit_short, 
            temperature_min,
            temperature_max,
            temperature_unit,
            (owm_cities_data_hist_ts_vti.humidity_value || ' ' || owm_cities_data_hist_ts_vti.humidity_unit)  humidity_u,
            humidity_value,
            humidity_unit,
            (owm_cities_data_hist_ts_vti.pressure_value || ' ' || owm_cities_data_hist_ts_vti.pressure_unit)  pressure_u,
            pressure_value,
            pressure_unit,
            (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s) | ' || owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code)  wind_u,
            (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s)')  wind_speed_u,
            (owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s')  wind_speed_value_u,
            (CASE WHEN wind_direction_value = '0'
                THEN wind_speed_value
                ELSE 0
                END)  wind_0,
            (CASE WHEN wind_direction_code = 'E'
                THEN wind_speed_value
                ELSE 0
                END)  wind_E,
            (CASE WHEN wind_direction_code = 'ENE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_ENE,
            (CASE WHEN wind_direction_code = 'ESE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_ESE,
            (CASE WHEN wind_direction_code = 'N'
                THEN wind_speed_value
                ELSE 0
                END)  wind_N,
            (CASE WHEN wind_direction_code = 'NE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_NE,
            (CASE WHEN wind_direction_code = 'NNE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_NNE,
            (CASE WHEN wind_direction_code = 'NNW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_NNW,
            (CASE WHEN wind_direction_code = 'NW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_NW,
            (CASE WHEN wind_direction_code = 'S'
                THEN wind_speed_value
                ELSE 0
                END)  wind_S,
            (CASE WHEN wind_direction_code = 'SE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_SE,
            (CASE WHEN wind_direction_code = 'SSE'
                THEN wind_speed_value
                ELSE 0
                END)  wind_SSE,
            (CASE WHEN wind_direction_code = 'SSW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_SSW,
            (CASE WHEN wind_direction_code = 'SW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_SW,
            (CASE WHEN wind_direction_code = 'W'
                THEN wind_speed_value
                ELSE 0
                END)  wind_W,
            (CASE WHEN wind_direction_code = 'WNW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_WNW,
            (CASE WHEN wind_direction_code = 'WSW'
                THEN wind_speed_value
                ELSE 0
                END)  wind_WSW,
            wind_speed_value,
            wind_speed_name,
            'm/s'  wind_speed_unit,
            (owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code)  wind_direction_u,
            (owm_cities_data_hist_ts_vti.wind_direction_value || 'º')  wind_direction_value_u,
            wind_direction_value,
            ' º'  wind_direction_unit,
            wind_direction_code,
            wind_direction_name,
            (clouds_name || ' (' || clouds_value || '%)')  clouds_u,
            clouds_value,
            '%'  clouds_unit,
            clouds_name,
            (owm_cities_data_hist_ts_vti.visibility_value || ' m')  visibility_u,
            visibility_value,
            'm'  visibility_unit,
            precipitation_mode,
            CASE WHEN precipitation_mode == 'no' 
                THEN '-'
                ELSE (precipitation_mode || ' | ' || owm_cities_data_hist_ts_vti.precipitation_value || ' mm    - ' || owm_cities_data_hist_ts_vti.precipitation_unit)
                END  precipitation_description,
            (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode == 'no'
                THEN '-'
                ELSE (owm_cities_data_hist_ts_vti.precipitation_value || ' mm    - ' || owm_cities_data_hist_ts_vti.precipitation_unit)
                END)  precipitation_u,
            owm_cities_data_hist_ts_vti.precipitation_value/(CASE WHEN LENGTH(owm_cities_data_hist_ts_vti.precipitation_unit) < 2 
                THEN 1
                ELSE (to_number(substr(owm_cities_data_hist_ts_vti.precipitation_unit,0,1))*6)
                END)  precipitation_value_10min,
            precipitation_value,
            precipitation_unit  precipitation_unit_time,
            'mm'  precipitation_unit,
            lastupdate_value
        
  FROM owm_cities_data_hist_ts_vti
      ,owm_cities
 WHERE 
       owm_cities.city_id = owm_cities_data_hist_ts_vti.city_id


;
GRANT SELECT ON owm_cities_data_v TO public;
Data View: owm_cities_data_v
Column Type Details Definition
city_id integer Primary key. City identifier given by the host.
city_name char City name.
location_name char 'city_name, city_country'.
city_country char Country of the city, acronym.
date_received date year to day DATE(owm_cities_data_hist_ts_vti.date_received)
datetime_received datetime year to fraction(5) owm_cities_data_hist_ts_vti.date_received
city_sun_rise datetime year to second Sunrise time.
city_sun_set datetime year to second Sunset time.
weather_description char 'clouds_name - precipitation_mode'
weather_icon_id int Primary key. Image identifier.
weather_icon_name varchar Image name.
weather_icon_type varchar Image type.
weather_icon_size int Image size.
weather_icon_data blob Image.
temperature_value_u varchar 'temperature_value temperature_unit_short'
temperature_min_u varchar 'temperature_min temperature_unit_short'
temperature_max_u varchar 'temperature_max temperature_unit_short'
temperature_value decimal Current temperature.
temperature_unit_short varchar Short version of the value in temperature_unit.
temperature_min decimal Minimum temperature.
temperature_max decimal Maximum temperature.
temperature_unit char Units format.
humidity_u varchar 'humidity_value humidity_unit'
humidity_value decimal Current humidity.
humidity_unit char Units format.
pressure_u varchar 'pressure_value pressure_unit'
pressure_value decimal Current pressure.
pressure_unit char Units format.
wind_u decimal 'wind_speed_name (wind_speed_value wind_speed_unit) | wind_direction_value wind_direction_unit wind direction_code'
wind_speed_u decimal 'wind_speed_value wind_speed_unit'
wind_[direction_code] decimal There is a column for each possible value of wind_direction_code, for easier representation of channel graph. It contains the value of wind_speed_value.
Example: wind_0, wind_N, wind_SSE, wind_NW...
wind_speed_value decimal Current wind speed.
wind_speed_name char Wind description.
wind_speed_unit varchar As long as the request to the API is done with the units atribute set to metric, this value should always be 'm/s'.
wind_direction_value decimal Wind direction degrees.
wind_direction_unit varchar As long as the request to the API is done with the units atribute set to metric, this value should always be 'º'.
wind_direction_code char Wind direction abreviation.
wind_direction_name char Wind direction description.
clouds_u varchar 'clouds_name (clouds_value clouds_unit)'
clouds_value decimal Cloudiness percentage.
clouds_name char Cloudiness description.
clouds_unit char As long as the request to the API is done with the units atribute set to metric, this value should always be '%'.
visibility_u varchar 'visibility_value visibility_unit'
visibility_value decimal Current visibility.
visibility_unit varchar As long as the request to the API is done with the units atribute set to metric, this value should always be 'm'.
precipitation_mode char Precipitation marker.
precipitation_description varchar 'precipitation mode | precipitation_value precipitation_unit - precipitation_unit_time'
precipitation_u varchar 'precipitation_value precipitation_unit - precipitation_unit_time'
precipitation_value_10min decimal precipitation_value/int(precipitation_unit_time)*6
precipitation_value decimal Current precipitation.
precipitation_unit_time char owm_cities_data_hist_ts_vti.precipitation_unit
precipitation_unit char As long as the request to the API is done with the units atribute set to metric, this value should always be 'mm'.
lastupdated_value datetime year to second Last weather updated.

3 Triggers, functions and scripts

In this section the triggers, fucntions and scripts used will be explained. All data manipulation regarding the response of the API will be done with this structure in mind. This is an example of the data provided by Open Weather Map, and can be found in this link with an explanation on each attribute's values.

Copy
<current>
    <city id="2643741" name="City of London">
        <coord lon="-0.09" lat="51.51">
        <country>GB</country>
        <sun rise="2015-06-30T03:46:57" set="2015-06-30T20:21:12">
    </city>
    <temperature value="72.34" min="66.2" max="79.88" unit="fahrenheit"/>
    <humidity value="43" unit="%">
    <pressure value="1020" unit="hPa">
    <wind>
        <speed value="7.78" name="Moderate breeze">
        <direction value="140" code="SE" name="SouthEast">
    </wind>
    <clouds value="0" name="clear sky">
    <visibility value="10000">
    <precipitation mode="rain" value="0.2" unit="1h">
    <weather number="800" value="Sky is Clear" icon="01d">
    <lastupdate value="2015-06-30T08:36:14">
</current>

3.1 Triggers

3.1.1 owm_cities_ins

This trigger follows the table owm_cities so that when a city is inserted, the corresponding TimeSeries row is also initialized.

Copy
<xsql-trigger name="owm_cities_ins" table="owm_cities" event="insert">
    <foreach-row>
          <insert table='owm_cities_data_hist_ts'>
            <column name='city_id' ><nxt>city_id</nxt></column>
            <column name='owm_data' >"origin(2019-01-01 00:00:00.00000), calendar(cal_10min_2019), container(container_owm_cities_data), threshold(0),irregular,[]"</column>
          </insert>
    </foreach-row>
</xsql-trigger>
Copy
-- **************************************************************************
-- owm_cities_ins
-- DEISTER WebStudio XSQL-TRIGGER Thu Aug 08 12:20:01 CEST 2019 Engine: informix
-- **************************************************************************
CREATE TRIGGER owm_cities_ins
INSERT  ON owm_cities
REFERENCING NEW AS nxt
  FOR EACH ROW
   (
   INSERT INTO owm_cities_data_hist_ts (city_id, owm_data)
     VALUES (nxt.city_id, "origin(2019-01-01 00:00:00.00000), calendar(cal_10min_2019), container(container_owm_cities_data), threshold(0),irregular,[]")
   )
;

3.2 Funtions

3.2.1 function_get_value_attribute

This function is described inside the loading script. It helps retrieve information from the XML response by giving it a node, a tag name and an argument.

Copy
<function name='function_get_value_attribute'>
    <args>
        <arg name='p_node'/>
        <arg name='p_tag_name'/>
        <arg name='p_arg'/>
    </args>
    <body>
        <set name='m_element'>
            <dom.getElementsByTagName tagname='#p_tag_name'>
                <p_node/>
            </dom.getElementsByTagName>
        </set>
        
        <set name='m_attribute'>
            <dom.element.getAttribute attr='#p_arg'>
                <array.get name='m_element'>0</array.get>
            </dom.element.getAttribute>
        </set>
        <if>
            <expr>
                <isnotnull><m_attribute/></isnotnull>
            </expr>
            <then>
                <return>
                    <m_attribute/>
                </return>
            </then>
            <else>
                <return>
                    <set name='m_attribute'>0</set>
                </return>
            </else>
        </if>
    </body>
</function>

3.3 Scripts

3.3.1 owm_cities_get_data

The function of this script is to send requests to the host API, for each city stored in owm_cities, to receive weather information in an XML response. This information is then casted if necessari and stored into variables to finally be inserted into the owm_cities_data_hist_ts_vti table.

This script is executed by a cron every 10 minutes and stored by the TimeSeries module into the row type created for it.

Copy
<!-- ================================================================================ -->
<!--                                                                                  -->
<!--    XSQL: owm_cities_get_data                                                          -->
<!--                                                                                  -->
<!-- ================================================================================ -->
<xsql-script name='owm_cities_get_data'>
    <body>

        <!-- ================================================================================== -->
        <!--                                                                                    -->
        <!--  FUNCT: From Node, Tag name with position and Atribute returns the value (String)  -->
        <!--                                                                                    -->
        <!-- ================================================================================== -->

        <function name='function_get_value_attribute'>
            <args>
                <arg name='p_node'/>
                <arg name='p_tag_name'/>
                <arg name='p_arg'/>
            </args>
            <body>
                <set name='m_element'>
                    <dom.getElementsByTagName tagname='#p_tag_name'>
                        <p_node/>
                    </dom.getElementsByTagName>
                </set>
                
                <set name='m_attribute'>
                    <dom.element.getAttribute attr='#p_arg'>
                        <array.get name='m_element'>0</array.get>
                    </dom.element.getAttribute>
                </set>
                <if>
                    <expr>
                        <isnotnull><m_attribute/></isnotnull>
                    </expr>
                    <then>
                        <return>
                            <m_attribute/>
                        </return>
                    </then>
                    <else>
                        <return>
                            <set name='m_attribute'>0</set>
                        </return>
                    </else>
                </if>
            </body>
        </function>
     
        
        <select prefix='m_api_'>
            <columns>
                apikey,
                host
            </columns>
            <from table='owm_apikey'/>
        </select>
        
        <foreach>
            <select prefix='m_city_'>
                <columns>
                    city_id <alias name='id'/>
                </columns>
                <from table='owm_cities'/>
            </select>
            <do>
                <set name='response'>
                    <http.connection.read>
                    	<http.connection 	url = '/data/2.5/weather?id=#m_city_id&amp;units=metric&amp;mode=xml&amp;APPID=#m_api_apikey'
                        					protocol= 'http'
                         					host='#m_api_host' />
                    </http.connection.read>
                </set>
                
                <set name='m_root'><dom.parse><response/></dom.parse></set>
                
                <set name='m_city_sun_rise'>
                    <date.timestamp format='yyyy-MM-dd HH:mm:ss'>
                        <string.replace>
                            <function_get_value_attribute>
                                <m_root/>
                                <string>sun</string>
                                <string>rise</string>
                            </function_get_value_attribute>
                            <string>T</string>
                            <string.space/>
                        </string.replace>
                    </date.timestamp>
                </set>

                <set name='m_city_sun_set'>
                    <date.timestamp format='yyyy-MM-dd HH:mm:ss'>
                        <string.replace>
                            <function_get_value_attribute>
                                <m_root/>
                                <string>sun</string>
                                <string>set</string>
                            </function_get_value_attribute>
                            <string>T</string>
                            <string.space/>
                        </string.replace>
                    </date.timestamp>
                </set>

                <set name='m_temperature_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>temperature</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_temperature_min'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>temperature</string>
                            <string>min</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_temperature_max'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>temperature</string>
                            <string>max</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_temperature_unit'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>temperature</string>
                            <string>unit</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>

                <set name='m_humidity_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>humidity</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_humidity_unit'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>humidity</string>
                            <string>unit</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>

                <set name='m_pressure_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>pressure</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_pressure_unit'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>pressure</string>
                            <string>unit</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>


                <!-- WIND -->
                <set name='m_wind_speed_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>speed</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_wind_speed_name'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>speed</string>
                            <string>name</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>

                <set name='m_wind_direction_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>direction</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_wind_direction_code'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>direction</string>
                            <string>code</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>
                <set name='m_wind_direction_name'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>direction</string>
                            <string>name</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>

                <!-- CLOUDS -->
                <set name='m_clouds_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>clouds</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>
                <set name='m_clouds_name'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>clouds</string>
                            <string>name</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>

                <!-- VISIBILITY -->
                <set name='m_visibility_value'>
                    <number>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>visibility</string>
                            <string>value</string>
                        </function_get_value_attribute>
                    </number>
                </set>

                <!-- PRECIPITATION -->
                <set name='m_precipitation_mode'>
                    <string.trim>
                        <function_get_value_attribute>
                            <m_root/>
                            <string>precipitation</string>
                            <string>mode</string>
                        </function_get_value_attribute>
                    </string.trim>
                </set>
                
                <if>
                    <expr>
                        <ne>
                            <m_precipitation_mode/>
                            <string>no</string>
                        </ne>
                    </expr>
                    <then>
                        <set name='m_precipitation_value'>
                            <number>
                                <function_get_value_attribute>
                                    <m_root/>
                                    <string>precipitation</string>
                                    <string>value</string>
                                </function_get_value_attribute>
                            </number>
                        </set>
                        <set name='m_precipitation_unit'>
                            <string.trim>
                                <function_get_value_attribute>
                                    <m_root/>
                                    <string>precipitation</string>
                                    <string>unit</string>
                                </function_get_value_attribute>
                            </string.trim>
                        </set>
                    </then>
                    <else>
                        <set name='m_precipitation_value'>0</set>
                        <set name='m_precipitation_unit'><string>-</string></set>
                    </else>
                </if>

                <set name='m_lastupdate_value'>
                    <date.timestamp format='yyyy-MM-dd HH:mm:ss'>
                        <string.replace>
                            <function_get_value_attribute>
                                <m_root/>
                                <string>lastupdate</string>
                                <string>value</string>
                            </function_get_value_attribute>
                            <string>T</string>
                            <string.space/>
                        </string.replace>
                    </date.timestamp>
                </set>

                <select prefix='m_date_'>
            <columns>
                ROUND(CURRENT,'MI') <alias name='current'/>
            </columns>
            <from table='systables'/>
            <where>
                tabid = 100
            </where>
        </select>
        
        <insert table='owm_cities_data_hist_ts_vti'>
            <column name='city_id'><m_city_id/></column>
            <column name='date_received'><m_date_current/></column>
            <column name='city_sun_rise'><m_city_sun_rise/></column>
            <column name='city_sun_set'><m_city_sun_set/></column>
            <column name='temperature_value'><m_temperature_value/></column>
            <column name='temperature_min'><m_temperature_min/></column>
            <column name='temperature_max'><m_temperature_max/></column>
            <column name='temperature_unit'><m_temperature_unit/></column>
            <column name='humidity_value'><m_humidity_value/></column>
            <column name='humidity_unit'><m_humidity_unit/></column>
            <column name='pressure_value'><m_pressure_value/></column>
            <column name='pressure_unit'><m_pressure_unit/></column>
            <column name='wind_speed_value'><m_wind_speed_value/></column>
            <column name='wind_speed_name'><m_wind_speed_name/></column>
            <column name='wind_direction_value'><m_wind_direction_value/></column>
            <column name='wind_direction_code'><m_wind_direction_code/></column>
            <column name='wind_direction_name'><m_wind_direction_name/></column>
            <column name='clouds_value'><m_clouds_value/></column>
            <column name='clouds_name'><m_clouds_name/></column>
            <column name='visibility_value'><m_visibility_value/></column>
            <column name='precipitation_value'><m_precipitation_value/></column>
            <column name='precipitation_mode'><m_precipitation_mode/></column>
            <column name='precipitation_unit'><m_precipitation_unit/></column>
            <column name='lastupdate_value'><m_lastupdate_value/></column>
        </insert>

            </do>
        </foreach>
        
    </body>
</xsql-script>