-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
User can select attributes and create CODAP table.
- Loading branch information
Showing
6 changed files
with
235 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,94 +1,155 @@ | ||
import fetchJsonp from "fetch-jsonp"; | ||
import { queryData } from "./query-headers"; | ||
import { ICropDataItem, queryData } from "./query-headers"; | ||
import { IStateOptions } from "../components/types"; | ||
import { connect } from "./connect"; | ||
import { cropOptions } from "../components/constants"; | ||
|
||
const baseURL = `https://quickstats.nass.usda.gov/api/api_GET/?key=9ED0BFB8-8DDD-3609-9940-A2341ED6A9E3`; | ||
|
||
export const createRequest = (attribute: string, geoLevel: string, location: string, year: string) => { | ||
interface IRequestParams { | ||
attribute: string, | ||
geographicLevel: string, | ||
location: string, | ||
year: string, | ||
cropCategory?: keyof ICropDataItem | ||
} | ||
|
||
interface IGetAttrDataParams { | ||
attribute: string, | ||
geographicLevel: string, | ||
cropUnits: string, | ||
state: string, | ||
year: string | ||
} | ||
|
||
export const createRequest = ({attribute, geographicLevel, location, year, cropCategory}: IRequestParams) => { | ||
const queryParams = queryData.find((d) => d.plugInAttribute === attribute); | ||
const {sector, group, commodity, category, domains, dataItem} = queryParams!; | ||
|
||
const baseReq = `${baseURL}§_desc=${sector}&group_desc=${group}&commodity_desc=${commodity}&statisticcat_desc=${category}&domain_desc=${domains}&agg_level_desc=${geoLevel}&state_name=${location}&year=${year}`; | ||
|
||
const reqs = []; | ||
let item; | ||
let cat; | ||
if (cropCategory) { | ||
const cropDataItem = queryParams?.dataItem as ICropDataItem; | ||
const cropCat = queryParams?.category as ICropDataItem; | ||
item = cropDataItem[cropCategory]; | ||
cat = cropCat[cropCategory]; | ||
} else { | ||
item = dataItem; | ||
cat = category; | ||
} | ||
|
||
const baseReq = `${baseURL}§_desc=${sector}&group_desc=${group}&commodity_desc=${commodity}&statisticcat_desc=${cat}&domain_desc=${domains}&agg_level_desc=${geographicLevel}&state_name=${location}&year=${year}`; | ||
let req = baseReq; | ||
if (Array.isArray(dataItem)) { | ||
dataItem.forEach(item => { | ||
reqs.push(`${baseReq}&short_desc=${item}`); | ||
dataItem.forEach(dItem => { | ||
req = req + `&short_desc=${dItem}`; | ||
}); | ||
} else { | ||
reqs.push(`${baseReq}&short_desc=${dataItem}`); | ||
req = req + `&short_desc=${item}`; | ||
} | ||
|
||
return reqs; | ||
return req; | ||
}; | ||
|
||
export const createQueryFromSelections = (selectedOptions: IStateOptions) => { | ||
const {geographicLevel, states, years, ...subOptions} = selectedOptions; | ||
export const createTableFromSelections = async (selectedOptions: IStateOptions) => { | ||
const {geographicLevel, states, cropUnits, years, ...subOptions} = selectedOptions; | ||
await connect.getNewDataContext(); | ||
await connect.createTopCollection(); | ||
|
||
// need to change this - instead of creating based on UI names, create based on dataItems in queryParams | ||
const allAttrs: Array<string|ICropDataItem> = ["Year"]; | ||
for (const key in subOptions) { | ||
const selections = subOptions[key as keyof typeof subOptions]; | ||
for (const attribute of selections) { | ||
const queryParams = queryData.find((d) => d.plugInAttribute === attribute); | ||
const {dataItem} = queryParams!; | ||
if (Array.isArray(dataItem)) { | ||
allAttrs.push(...dataItem); | ||
} else { | ||
allAttrs.push(dataItem); | ||
} | ||
} | ||
} | ||
await connect.createSubCollection(allAttrs); | ||
const items = await getItems(selectedOptions); | ||
await connect.createItems(items); | ||
await connect.makeCaseTableAppear(); | ||
} | ||
|
||
const getItems = async (selectedOptions: IStateOptions) => { | ||
const {states, years} = selectedOptions; | ||
const multipleStatesSelected = states.length > 1 || states[0] === "All States"; | ||
const multipleYearsSelected = years.length > 1; | ||
|
||
const items = []; | ||
if (multipleStatesSelected) { | ||
states.forEach((state) => { | ||
for (const state of states) { | ||
if (multipleYearsSelected) { | ||
years.forEach(year => { | ||
// do something | ||
console.log("multiple years and mulitple states selected"); | ||
}); | ||
for (const year of years) { | ||
const item = await getDataForSingleYearAndState(selectedOptions, state, year); | ||
items.push(item); | ||
} | ||
} else { | ||
console.log("multiple states selected with one year"); | ||
const item = await getDataForSingleYearAndState(selectedOptions, state, years[0]); | ||
items.push(item); | ||
} | ||
}); | ||
} | ||
} else { | ||
for (const key in subOptions) { | ||
const value = subOptions[key as keyof typeof subOptions]; | ||
console.log("current value", value); | ||
if (value && Array.isArray(value) && value.length > 1) { | ||
console.log("you selected more than one value from a sub-category"); | ||
} else if (value && Array.isArray(value) && value.length === 1) { | ||
console.log("you selected only one value from a sub-category and it is this value", value); | ||
const reqArray = createRequest(value[0], geographicLevel, states[0], years[0]); | ||
console.log("REQUEST", reqArray[0]); | ||
getDataAndCreateCodapTable(reqArray); | ||
const item = await getDataForSingleYearAndState(selectedOptions, states[0], years[0]); | ||
items.push(item); | ||
} | ||
|
||
return items; | ||
}; | ||
|
||
const getDataForSingleYearAndState = async (selectedOptions: IStateOptions, state: string, year: string) => { | ||
const {geographicLevel, states, years, cropUnits, ...subOptions} = selectedOptions; | ||
|
||
let item: any = { | ||
"State": state, | ||
"Year": year, | ||
} | ||
|
||
for (const key in subOptions) { | ||
const value = subOptions[key as keyof typeof subOptions]; | ||
if (value && Array.isArray(value)) { | ||
for (const attribute of value) { | ||
const attrData = await getAttrData({attribute, geographicLevel, state, year, cropUnits}); | ||
item = {...item, ...attrData}; | ||
} | ||
} | ||
} | ||
}; | ||
|
||
export const getDataAndCreateCodapTable = (reqs: string[]) => { | ||
reqs.forEach((req) => { | ||
fetchJsonp(req) | ||
.then(function(response) { | ||
return response.json(); | ||
}).then(function(json) { | ||
console.log("parsed json", json); | ||
const formattedData = formatDataForCODAP(json); | ||
}).catch(function(ex) { | ||
console.log("parsing failed", ex); | ||
}); | ||
}); | ||
return item; | ||
}; | ||
|
||
const formatDataForCODAP = (res: any) => { | ||
console.log({res}); | ||
return res; | ||
}; | ||
const getAttrData = async (params: IGetAttrDataParams) => { | ||
const {attribute, geographicLevel, state, year, cropUnits} = params; | ||
const reqParams: IRequestParams = {attribute, geographicLevel, location: state, year}; | ||
if (cropOptions.options.includes(attribute) && cropUnits) { | ||
reqParams.cropCategory = cropUnits as keyof ICropDataItem; | ||
} | ||
const req = createRequest(reqParams); | ||
const res = await fetchData(req); | ||
const values: any = {}; | ||
if (res) { | ||
const {data} = res; | ||
data.forEach((dataItem: any) => { | ||
values[dataItem.short_desc] = dataItem.Value; | ||
}) | ||
} else { | ||
console.log("error"); | ||
} | ||
return values; | ||
} | ||
|
||
// export const runTestQuery = () => { | ||
// const request1 = createRequest("Total Farmers", "STATE", "CALIFORNIA", "2017")[0]; | ||
// const request2 = createRequest("Total Farmers", "STATE", "ARKANSAS", "2017")[0]; | ||
// const request3 = createRequest("Total Farmers", "STATE", "ALABAMA", "2017")[0]; | ||
// const request4 = createRequest("Total Farmers", "STATE", "MONTANA", "2017")[0]; | ||
// const requests = [request1, request2, request3, request4]; | ||
// requests.forEach((req) => { | ||
// fetchJsonp(req) | ||
// .then(function(response) { | ||
// return response.json(); | ||
// }).then(function(json) { | ||
// console.log("parsed json", json); | ||
// }).catch(function(ex) { | ||
// console.log("parsing failed", ex); | ||
// }) | ||
// }) | ||
// }; | ||
export const fetchData = async (req: string) => { | ||
try { | ||
const response = await fetchJsonp(req); | ||
const json = await response.json(); | ||
return json; | ||
} catch (error) { | ||
console.log("parsing failed", error); | ||
throw error; | ||
} | ||
}; |
Oops, something went wrong.