| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import asyncio |
| from decimal import Decimal |
| |
| from pyignite import AioClient |
| |
| |
| COUNTRY_TABLE_NAME = 'Country' |
| CITY_TABLE_NAME = 'City' |
| LANGUAGE_TABLE_NAME = 'CountryLanguage' |
| |
| COUNTRY_CREATE_TABLE_QUERY = '''CREATE TABLE Country ( |
| Code CHAR(3) PRIMARY KEY, |
| Name CHAR(52), |
| Continent CHAR(50), |
| Region CHAR(26), |
| SurfaceArea DECIMAL(10,2), |
| IndepYear SMALLINT(6), |
| Population INT(11), |
| LifeExpectancy DECIMAL(3,1), |
| GNP DECIMAL(10,2), |
| GNPOld DECIMAL(10,2), |
| LocalName CHAR(45), |
| GovernmentForm CHAR(45), |
| HeadOfState CHAR(60), |
| Capital INT(11), |
| Code2 CHAR(2) |
| )''' |
| |
| COUNTRY_INSERT_QUERY = '''INSERT INTO Country( |
| Code, Name, Continent, Region, |
| SurfaceArea, IndepYear, Population, |
| LifeExpectancy, GNP, GNPOld, |
| LocalName, GovernmentForm, HeadOfState, |
| Capital, Code2 |
| ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''' |
| |
| CITY_CREATE_TABLE_QUERY = '''CREATE TABLE City ( |
| ID INT(11), |
| Name CHAR(35), |
| CountryCode CHAR(3), |
| District CHAR(20), |
| Population INT(11), |
| PRIMARY KEY (ID, CountryCode) |
| ) WITH "affinityKey=CountryCode"''' |
| |
| CITY_CREATE_INDEX = ''' |
| CREATE INDEX idx_country_code ON city (CountryCode)''' |
| |
| CITY_INSERT_QUERY = '''INSERT INTO City( |
| ID, Name, CountryCode, District, Population |
| ) VALUES (?, ?, ?, ?, ?)''' |
| |
| LANGUAGE_CREATE_TABLE_QUERY = '''CREATE TABLE CountryLanguage ( |
| CountryCode CHAR(3), |
| Language CHAR(30), |
| IsOfficial BOOLEAN, |
| Percentage DECIMAL(4,1), |
| PRIMARY KEY (CountryCode, Language) |
| ) WITH "affinityKey=CountryCode"''' |
| |
| LANGUAGE_CREATE_INDEX = ''' |
| CREATE INDEX idx_lang_country_code ON CountryLanguage (CountryCode)''' |
| |
| LANGUAGE_INSERT_QUERY = '''INSERT INTO CountryLanguage( |
| CountryCode, Language, IsOfficial, Percentage |
| ) VALUES (?, ?, ?, ?)''' |
| |
| DROP_TABLE_QUERY = '''DROP TABLE {} IF EXISTS''' |
| |
| COUNTRY_DATA = [ |
| [ |
| 'USA', 'United States', 'North America', 'North America', |
| Decimal('9363520.00'), 1776, 278357000, |
| Decimal('77.1'), Decimal('8510700.00'), Decimal('8110900.00'), |
| 'United States', 'Federal Republic', 'George W. Bush', |
| 3813, 'US', |
| ], |
| [ |
| 'IND', 'India', 'Asia', 'Southern and Central Asia', |
| Decimal('3287263.00'), 1947, 1013662000, |
| Decimal('62.5'), Decimal('447114.00'), Decimal('430572.00'), |
| 'Bharat/India', 'Federal Republic', 'Kocheril Raman Narayanan', |
| 1109, 'IN', |
| ], |
| [ |
| 'CHN', 'China', 'Asia', 'Eastern Asia', |
| Decimal('9572900.00'), -1523, 1277558000, |
| Decimal('71.4'), Decimal('982268.00'), Decimal('917719.00'), |
| 'Zhongquo', 'PeoplesRepublic', 'Jiang Zemin', |
| 1891, 'CN', |
| ], |
| ] |
| |
| CITY_DATA = [ |
| [3793, 'New York', 'USA', 'New York', 8008278], |
| [3794, 'Los Angeles', 'USA', 'California', 3694820], |
| [3795, 'Chicago', 'USA', 'Illinois', 2896016], |
| [3796, 'Houston', 'USA', 'Texas', 1953631], |
| [3797, 'Philadelphia', 'USA', 'Pennsylvania', 1517550], |
| [3798, 'Phoenix', 'USA', 'Arizona', 1321045], |
| [3799, 'San Diego', 'USA', 'California', 1223400], |
| [3800, 'Dallas', 'USA', 'Texas', 1188580], |
| [3801, 'San Antonio', 'USA', 'Texas', 1144646], |
| [3802, 'Detroit', 'USA', 'Michigan', 951270], |
| [3803, 'San Jose', 'USA', 'California', 894943], |
| [3804, 'Indianapolis', 'USA', 'Indiana', 791926], |
| [3805, 'San Francisco', 'USA', 'California', 776733], |
| [1024, 'Mumbai (Bombay)', 'IND', 'Maharashtra', 10500000], |
| [1025, 'Delhi', 'IND', 'Delhi', 7206704], |
| [1026, 'Calcutta [Kolkata]', 'IND', 'West Bengali', 4399819], |
| [1027, 'Chennai (Madras)', 'IND', 'Tamil Nadu', 3841396], |
| [1028, 'Hyderabad', 'IND', 'Andhra Pradesh', 2964638], |
| [1029, 'Ahmedabad', 'IND', 'Gujarat', 2876710], |
| [1030, 'Bangalore', 'IND', 'Karnataka', 2660088], |
| [1031, 'Kanpur', 'IND', 'Uttar Pradesh', 1874409], |
| [1032, 'Nagpur', 'IND', 'Maharashtra', 1624752], |
| [1033, 'Lucknow', 'IND', 'Uttar Pradesh', 1619115], |
| [1034, 'Pune', 'IND', 'Maharashtra', 1566651], |
| [1035, 'Surat', 'IND', 'Gujarat', 1498817], |
| [1036, 'Jaipur', 'IND', 'Rajasthan', 1458483], |
| [1890, 'Shanghai', 'CHN', 'Shanghai', 9696300], |
| [1891, 'Peking', 'CHN', 'Peking', 7472000], |
| [1892, 'Chongqing', 'CHN', 'Chongqing', 6351600], |
| [1893, 'Tianjin', 'CHN', 'Tianjin', 5286800], |
| [1894, 'Wuhan', 'CHN', 'Hubei', 4344600], |
| [1895, 'Harbin', 'CHN', 'Heilongjiang', 4289800], |
| [1896, 'Shenyang', 'CHN', 'Liaoning', 4265200], |
| [1897, 'Kanton [Guangzhou]', 'CHN', 'Guangdong', 4256300], |
| [1898, 'Chengdu', 'CHN', 'Sichuan', 3361500], |
| [1899, 'Nanking [Nanjing]', 'CHN', 'Jiangsu', 2870300], |
| [1900, 'Changchun', 'CHN', 'Jilin', 2812000], |
| [1901, 'Xi´an', 'CHN', 'Shaanxi', 2761400], |
| [1902, 'Dalian', 'CHN', 'Liaoning', 2697000], |
| [1903, 'Qingdao', 'CHN', 'Shandong', 2596000], |
| [1904, 'Jinan', 'CHN', 'Shandong', 2278100], |
| [1905, 'Hangzhou', 'CHN', 'Zhejiang', 2190500], |
| [1906, 'Zhengzhou', 'CHN', 'Henan', 2107200], |
| ] |
| |
| LANGUAGE_DATA = [ |
| ['USA', 'Chinese', False, Decimal('0.6')], |
| ['USA', 'English', True, Decimal('86.2')], |
| ['USA', 'French', False, Decimal('0.7')], |
| ['USA', 'German', False, Decimal('0.7')], |
| ['USA', 'Italian', False, Decimal('0.6')], |
| ['USA', 'Japanese', False, Decimal('0.2')], |
| ['USA', 'Korean', False, Decimal('0.3')], |
| ['USA', 'Polish', False, Decimal('0.3')], |
| ['USA', 'Portuguese', False, Decimal('0.2')], |
| ['USA', 'Spanish', False, Decimal('7.5')], |
| ['USA', 'Tagalog', False, Decimal('0.4')], |
| ['USA', 'Vietnamese', False, Decimal('0.2')], |
| ['IND', 'Asami', False, Decimal('1.5')], |
| ['IND', 'Bengali', False, Decimal('8.2')], |
| ['IND', 'Gujarati', False, Decimal('4.8')], |
| ['IND', 'Hindi', True, Decimal('39.9')], |
| ['IND', 'Kannada', False, Decimal('3.9')], |
| ['IND', 'Malajalam', False, Decimal('3.6')], |
| ['IND', 'Marathi', False, Decimal('7.4')], |
| ['IND', 'Orija', False, Decimal('3.3')], |
| ['IND', 'Punjabi', False, Decimal('2.8')], |
| ['IND', 'Tamil', False, Decimal('6.3')], |
| ['IND', 'Telugu', False, Decimal('7.8')], |
| ['IND', 'Urdu', False, Decimal('5.1')], |
| ['CHN', 'Chinese', True, Decimal('92.0')], |
| ['CHN', 'Dong', False, Decimal('0.2')], |
| ['CHN', 'Hui', False, Decimal('0.8')], |
| ['CHN', 'Mantšu', False, Decimal('0.9')], |
| ['CHN', 'Miao', False, Decimal('0.7')], |
| ['CHN', 'Mongolian', False, Decimal('0.4')], |
| ['CHN', 'Puyi', False, Decimal('0.2')], |
| ['CHN', 'Tibetan', False, Decimal('0.4')], |
| ['CHN', 'Tujia', False, Decimal('0.5')], |
| ['CHN', 'Uighur', False, Decimal('0.6')], |
| ['CHN', 'Yi', False, Decimal('0.6')], |
| ['CHN', 'Zhuang', False, Decimal('1.4')], |
| ] |
| |
| |
| async def main(): |
| # establish connection |
| client = AioClient() |
| async with client.connect('127.0.0.1', 10800): |
| # create tables |
| for query in [ |
| COUNTRY_CREATE_TABLE_QUERY, |
| CITY_CREATE_TABLE_QUERY, |
| LANGUAGE_CREATE_TABLE_QUERY, |
| ]: |
| await client.sql(query) |
| |
| # create indices |
| for query in [CITY_CREATE_INDEX, LANGUAGE_CREATE_INDEX]: |
| await client.sql(query) |
| |
| # load data concurrently. |
| await asyncio.gather(*[ |
| client.sql(COUNTRY_INSERT_QUERY, query_args=row) for row in COUNTRY_DATA |
| ]) |
| |
| await asyncio.gather(*[ |
| client.sql(CITY_INSERT_QUERY, query_args=row) for row in CITY_DATA |
| ]) |
| |
| await asyncio.gather(*[ |
| client.sql(LANGUAGE_INSERT_QUERY, query_args=row) for row in LANGUAGE_DATA |
| ]) |
| |
| # 10 most populated cities (with pagination) |
| MOST_POPULATED_QUERY = ''' |
| SELECT name, population FROM City ORDER BY population DESC LIMIT 10''' |
| |
| async with client.sql(MOST_POPULATED_QUERY) as cursor: |
| print('Most 10 populated cities:') |
| |
| async for row in cursor: |
| print(row) |
| # Most 10 populated cities: |
| # ['Mumbai (Bombay)', 10500000] |
| # ['Shanghai', 9696300] |
| # ['New York', 8008278] |
| # ['Peking', 7472000] |
| # ['Delhi', 7206704] |
| # ['Chongqing', 6351600] |
| # ['Tianjin', 5286800] |
| # ['Calcutta [Kolkata]', 4399819] |
| # ['Wuhan', 4344600] |
| # ['Harbin', 4289800] |
| |
| # 10 most populated cities in 3 countries (with pagination and header row) |
| MOST_POPULATED_IN_3_COUNTRIES_QUERY = ''' |
| SELECT country.name as country_name, city.name as city_name, MAX(city.population) AS max_pop FROM country |
| JOIN city ON city.countrycode = country.code |
| WHERE country.code IN ('USA','IND','CHN') |
| GROUP BY country.name, city.name ORDER BY max_pop DESC LIMIT 10 |
| ''' |
| |
| async with client.sql(MOST_POPULATED_IN_3_COUNTRIES_QUERY, include_field_names=True) as cursor: |
| print('Most 10 populated cities in USA, India and China:') |
| print(await cursor.__anext__()) |
| print('----------------------------------------') |
| async for row in cursor: |
| print(row) |
| # Most 10 populated cities in USA, India and China: |
| # ['COUNTRY_NAME', 'CITY_NAME', 'MAX_POP'] |
| # ---------------------------------------- |
| # ['India', 'Mumbai (Bombay)', 10500000] |
| # ['China', 'Shanghai', 9696300] |
| # ['United States', 'New York', 8008278] |
| # ['China', 'Peking', 7472000] |
| # ['India', 'Delhi', 7206704] |
| # ['China', 'Chongqing', 6351600] |
| # ['China', 'Tianjin', 5286800] |
| # ['India', 'Calcutta [Kolkata]', 4399819] |
| # ['China', 'Wuhan', 4344600] |
| # ['China', 'Harbin', 4289800] |
| |
| # show city info |
| CITY_INFO_QUERY = '''SELECT * FROM City WHERE id = ?''' |
| |
| async with client.sql(CITY_INFO_QUERY, query_args=[3802], include_field_names=True) as cursor: |
| field_names = await cursor.__anext__() |
| field_data = await cursor.__anext__() |
| |
| print('City info:') |
| for field_name, field_value in zip(field_names * len(field_data), field_data): |
| print('{}: {}'.format(field_name, field_value)) |
| # City info: |
| # ID: 3802 |
| # NAME: Detroit |
| # COUNTRYCODE: USA |
| # DISTRICT: Michigan |
| # POPULATION: 951270 |
| |
| # clean up concurrently. |
| await asyncio.gather(*[ |
| client.sql(DROP_TABLE_QUERY.format(table_name)) for table_name in [ |
| CITY_TABLE_NAME, |
| LANGUAGE_TABLE_NAME, |
| COUNTRY_TABLE_NAME, |
| ] |
| ]) |
| |
| |
| loop = asyncio.get_event_loop() |
| loop.run_until_complete(main()) |