Reinstated history functionality. This is for all platforms except for Metaculus (and Estimize). I'll see how it goes, and i particular, if I exceed the limit for July. If I do, the thing to do is to have a history for every platform for every month, rather than a history for all platforms for every month. It would make things slightly messier, though
This commit is contained in:
parent
c5bf99cee8
commit
216be068a9
|
@ -20,14 +20,13 @@ import {predictit} from "./platforms/predictit-fetch.js"
|
|||
import {rootclaim} from "./platforms/rootclaim-fetch.js"
|
||||
import {smarkets} from "./platforms/smarkets-fetch.js"
|
||||
import {williamhill} from "./platforms/williamhill-fetch.js"
|
||||
|
||||
import {mergeEverything} from "./utils/mergeEverything.js"
|
||||
import {addToHistory} from "./utils/addToHistory.js"
|
||||
import {updateHistory} from "./utils/history/updateHistory.js"
|
||||
import {rebuildNetlifySiteWithNewData} from "./utils/rebuildNetliftySiteWithNewData.js"
|
||||
import {doEverything, tryCatchTryAgain} from "./utils/doEverything.js"
|
||||
|
||||
/* Support functions */
|
||||
let functions = [astralcodexten, coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, goodjudgment, goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, addToHistory, rebuildNetlifySiteWithNewData, doEverything]
|
||||
let functions = [astralcodexten, coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, goodjudgment, goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData, doEverything]
|
||||
let functionNames = functions.map(fun => fun.name)
|
||||
|
||||
let whattodoMessage = functionNames
|
||||
|
@ -35,7 +34,7 @@ let whattodoMessage = functionNames
|
|||
.map((functionName,i) => `[${i}]: Download predictions from ${functionName}`)
|
||||
.join('\n') +
|
||||
`\n[${functionNames.length-4}]: Merge jsons them into one big json (and push it to mongodb database)` +
|
||||
`\n[${functionNames.length-3}]: Add to history file` +
|
||||
`\n[${functionNames.length-3}]: Update history` +
|
||||
`\n[${functionNames.length-2}]: Rebuild netlify site with new data` +
|
||||
// `\n[${functionNames.length-1}]: Add to history` +
|
||||
`\n[${functionNames.length-1}]: All of the above` +
|
||||
|
|
|
@ -17,7 +17,7 @@ import {rootclaim} from "../platforms/rootclaim-fetch.js"
|
|||
import {smarkets} from "../platforms/smarkets-fetch.js"
|
||||
import {williamhill} from "../platforms/williamhill-fetch.js"
|
||||
import {mergeEverything} from "./mergeEverything.js"
|
||||
import {addToHistory} from "./addToHistory.js"
|
||||
import {updateHistory} from "./history/updateHistory.js"
|
||||
import {rebuildNetlifySiteWithNewData} from "./rebuildNetliftySiteWithNewData.js"
|
||||
|
||||
/* Do everything */
|
||||
|
@ -37,7 +37,7 @@ export async function tryCatchTryAgain (fun) {
|
|||
}
|
||||
}
|
||||
export async function doEverything(){
|
||||
let functions = [coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, /* goodjudgment, */ goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, /*addToHistory,*/rebuildNetlifySiteWithNewData]
|
||||
let functions = [coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, /* goodjudgment, */ goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData]
|
||||
// Removed Good Judgment from the fetcher, doing it using cron instead because cloudflare blocks the utility on heroku.
|
||||
|
||||
console.log("")
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
import { writeFileSync } from "fs"
|
||||
import { mongoReadWithReadCredentials, upsert } from "./mongo-wrapper.js"
|
||||
import { mongoReadWithReadCredentials, upsert } from "../mongo-wrapper.js"
|
||||
let mongoRead = mongoReadWithReadCredentials
|
||||
let isEmptyArray = arr => arr.length == 0
|
||||
|
||||
export async function addToHistory(){
|
||||
// throw new Error("Not today")
|
||||
let currentJSON = await mongoRead("metaforecasts")
|
||||
let currentDate = new Date()
|
||||
let dateUpToMonth = currentDate.toISOString().slice(0,7).replace("-", "_")
|
||||
|
||||
let currentJSONwithMetaculus = await mongoRead("metaforecasts")
|
||||
let currentJSON = currentJSONwithMetaculus.filter(element => element.platform != "Metaculus" && element.platform != "Estimize") // without Metaculus
|
||||
// console.log(currentJSON.slice(0,20))
|
||||
// console.log(currentJSON)
|
||||
let historyJSON = await mongoRead("metaforecast_history")
|
||||
let historyJSON = await mongoRead(`metaforecast_history_${dateUpToMonth}`,"metaforecastHistory")
|
||||
// console.log(historyJSON)
|
||||
|
||||
let currentForecastsWithAHistory = currentJSON.filter(element => !isEmptyArray(historyJSON.filter(historyElement => historyElement.title == element.title && historyElement.url == element.url )))
|
||||
|
@ -55,7 +59,8 @@ export async function addToHistory(){
|
|||
newHistoryJSON.push(newHistoryElement)
|
||||
}
|
||||
|
||||
upsert(newHistoryJSON, "metaforecast_history")
|
||||
await upsert(newHistoryJSON, `metaforecast_history_${dateUpToMonth}`, "metaforecastHistory")
|
||||
|
||||
// console.log(newHistoryJSON.slice(0,5))
|
||||
// writeFileSync("metaforecast_history.json", JSON.stringify(newHistoryJSON, null, 2))
|
||||
// writefile(JSON.stringify(newHistoryJSON, null, 2), "metaforecasts_history", "", ".json")
|
||||
|
@ -63,6 +68,6 @@ export async function addToHistory(){
|
|||
/*
|
||||
let forecastsAlreadyInHistory = currentJSON.filter(element => !isEmptyArray(historyJSON.filter(historyElement => historyElement.title == element.title && historyElement.url == element.url )))
|
||||
*/
|
||||
console.log(new Date().toISOString())
|
||||
//console.log(new Date().toISOString())
|
||||
}
|
||||
// addToHistory()
|
||||
// updateHistory()
|
27
src/utils/history/createHistoryForMonth.js
Normal file
27
src/utils/history/createHistoryForMonth.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
import { mongoRead, upsert } from "../mongo-wrapper.js"
|
||||
|
||||
export async function createHistoryForMonth(){
|
||||
let currentDate = new Date()
|
||||
let dateUpToMonth = currentDate.toISOString().slice(0,7).replace("-", "_")
|
||||
let metaforecasts = await mongoRead("metaforecasts")
|
||||
let metaforecastsHistorySeed = metaforecasts.map(element => {
|
||||
// let moreoriginsdata = element.author ? ({author: element.author}) : ({})
|
||||
return ({
|
||||
title: element.title,
|
||||
url: element.url,
|
||||
platform: element.platform,
|
||||
moreoriginsdata: element.moreoriginsdata || {},
|
||||
description: element.description,
|
||||
history: [{
|
||||
timestamp: element.timestamp,
|
||||
options: element.options,
|
||||
qualityindicators: element.qualityindicators
|
||||
}],
|
||||
extra: element.extra || {}
|
||||
})
|
||||
}).filter(element => element.platform != "Metaculus" && element.platform != "Estimize")
|
||||
//console.log(metaforecastsHistorySeed)
|
||||
await upsert(metaforecastsHistorySeed, `metaforecast_history_${dateUpToMonth}`, "metaforecastHistory")
|
||||
|
||||
}
|
||||
////createInitialHistory()
|
68
src/utils/history/old/addToHistory_old.js
Normal file
68
src/utils/history/old/addToHistory_old.js
Normal file
|
@ -0,0 +1,68 @@
|
|||
import { writeFileSync } from "fs"
|
||||
import { mongoReadWithReadCredentials, upsert } from "../mongo-wrapper.js"
|
||||
let mongoRead = mongoReadWithReadCredentials
|
||||
let isEmptyArray = arr => arr.length == 0
|
||||
|
||||
export async function addToHistory(){
|
||||
// throw new Error("Not today")
|
||||
let currentJSON = await mongoRead("metaforecasts")
|
||||
// console.log(currentJSON)
|
||||
let historyJSON = await mongoRead("metaforecast_history")
|
||||
// console.log(historyJSON)
|
||||
|
||||
let currentForecastsWithAHistory = currentJSON.filter(element => !isEmptyArray(historyJSON.filter(historyElement => historyElement.title == element.title && historyElement.url == element.url )))
|
||||
// console.log(currentForecastsWithAHistory)
|
||||
|
||||
let currentForecastsWithoutAHistory = currentJSON.filter(element => isEmptyArray(historyJSON.filter(historyElement => historyElement.title == element.title && historyElement.url == element.url )))
|
||||
// console.log(currentForecastsWithoutAHistory)
|
||||
|
||||
// Add both types of forecast
|
||||
let newHistoryJSON = []
|
||||
for(let historyElement of historyJSON){
|
||||
let correspondingNewElementArray = currentForecastsWithAHistory.filter(element => historyElement.title == element.title && historyElement.url == element.url )
|
||||
// console.log(correspondingNewElement)
|
||||
if(!isEmptyArray(correspondingNewElementArray)){
|
||||
let correspondingNewElement = correspondingNewElementArray[0]
|
||||
let timeStampOfNewElement = correspondingNewElement.timestamp
|
||||
let doesHistoryAlreadyContainElement = historyElement.history.map(element => element.timestamp).includes(timeStampOfNewElement)
|
||||
if(!doesHistoryAlreadyContainElement){
|
||||
let historyWithNewElement = historyElement["history"].concat({
|
||||
"timestamp": correspondingNewElement.timestamp,
|
||||
"options": correspondingNewElement.options,
|
||||
"qualityindicators": correspondingNewElement.qualityindicators
|
||||
})
|
||||
let newHistoryElement = {...correspondingNewElement, "history": historyWithNewElement}
|
||||
// If some element (like the description) changes, we keep the new one.
|
||||
newHistoryJSON.push(newHistoryElement)
|
||||
}else{
|
||||
newHistoryJSON.push(historyElement)
|
||||
}
|
||||
}else{
|
||||
// console.log(historyElement)
|
||||
newHistoryJSON.push(historyElement)
|
||||
}
|
||||
}
|
||||
|
||||
for(let currentForecast of currentForecastsWithoutAHistory){
|
||||
let newHistoryElement = ({...currentForecast, "history": [{
|
||||
"timestamp": currentForecast.timestamp,
|
||||
"options": currentForecast.options,
|
||||
"qualityindicators": currentForecast.qualityindicators
|
||||
}]})
|
||||
delete newHistoryElement.timestamp
|
||||
delete newHistoryElement.options
|
||||
delete newHistoryElement.qualityindicators
|
||||
newHistoryJSON.push(newHistoryElement)
|
||||
}
|
||||
|
||||
upsert(newHistoryJSON, "metaforecast_history")
|
||||
// console.log(newHistoryJSON.slice(0,5))
|
||||
// writeFileSync("metaforecast_history.json", JSON.stringify(newHistoryJSON, null, 2))
|
||||
// writefile(JSON.stringify(newHistoryJSON, null, 2), "metaforecasts_history", "", ".json")
|
||||
//console.log(newHistoryJSON)
|
||||
/*
|
||||
let forecastsAlreadyInHistory = currentJSON.filter(element => !isEmptyArray(historyJSON.filter(historyElement => historyElement.title == element.title && historyElement.url == element.url )))
|
||||
*/
|
||||
console.log(new Date().toISOString())
|
||||
}
|
||||
// addToHistory()
|
|
@ -1,4 +1,4 @@
|
|||
import { mongoRead, upsert } from "./mongo-wrapper.js"
|
||||
import { mongoRead, upsert } from "../mongo-wrapper.js"
|
||||
|
||||
let createInitialHistory = async () => {
|
||||
let metaforecasts = await mongoRead("metaforecasts")
|
14
src/utils/history/updateHistory.js
Normal file
14
src/utils/history/updateHistory.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { addToHistory } from "./addToHistory.js"
|
||||
import { createHistoryForMonth } from "./createHistoryForMonth.js"
|
||||
|
||||
export async function updateHistory(){
|
||||
let currentDate = new Date()
|
||||
let dayOfMonth = currentDate.getDate()
|
||||
if(dayOfMonth == 1){
|
||||
console.log(`Creating history for the month ${currentDate.toISOString().slice(0,7)}`)
|
||||
await createHistoryForMonth()
|
||||
}else{
|
||||
console.log(`Updating history for ${currentDate.toISOString()}`)
|
||||
await addToHistory()
|
||||
}
|
||||
}
|
|
@ -2,6 +2,39 @@ import pkg from 'mongodb';
|
|||
const {MongoClient} = pkg;
|
||||
import {getCookie} from "./getCookies.js"
|
||||
|
||||
function roughSizeOfObject( object ) {
|
||||
var objectList = [];
|
||||
var stack = [ object ];
|
||||
var bytes = 0;
|
||||
|
||||
while ( stack.length ) {
|
||||
var value = stack.pop();
|
||||
if ( typeof value === 'boolean' ) {
|
||||
bytes += 4;
|
||||
}
|
||||
else if ( typeof value === 'string' ) {
|
||||
bytes += value.length * 2;
|
||||
}
|
||||
else if ( typeof value === 'number' ) {
|
||||
bytes += 8;
|
||||
}
|
||||
else if
|
||||
(
|
||||
typeof value === 'object'
|
||||
&& objectList.indexOf( value ) === -1
|
||||
)
|
||||
{
|
||||
objectList.push( value );
|
||||
|
||||
for( var i in value ) {
|
||||
stack.push( value[ i ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
let megaBytes = bytes / (1024)**2
|
||||
let megaBytesRounded = Math.round(megaBytes*10)/10
|
||||
return megaBytesRounded;
|
||||
}
|
||||
|
||||
export async function upsert (contents, documentName, collectionName="metaforecastCollection", databaseName="metaforecastDatabase"){
|
||||
const url = process.env.MONGODB_URL || getCookie("mongodb");
|
||||
|
@ -32,8 +65,9 @@ export async function upsert (contents, documentName, collectionName="metaforeca
|
|||
const myDocument = await collection.findOne(filter);
|
||||
|
||||
// Print to the console
|
||||
console.log(myDocument.contentsArray.slice(0,1
|
||||
));
|
||||
console.log(`Updating document ${documentName} in collection ${collectionName} in database ${databaseName} with approximate size ${roughSizeOfObject(contents)} MB`)
|
||||
console.log("Sample: ")
|
||||
console.log(JSON.stringify(myDocument.contentsArray.slice(0,1), null, 4));
|
||||
} catch (err) {
|
||||
console.log(err.stack);
|
||||
}
|
||||
|
@ -117,3 +151,38 @@ export async function mongoReadWithReadCredentials (documentName, collectionName
|
|||
// console.log(documentContents.slice(0,1));
|
||||
return documentContents
|
||||
}
|
||||
|
||||
export async function mongoGetAllElements(databaseName = "metaforecastDatabase", collectionName="metaforecastCollection"){
|
||||
const url = process.env.MONGODB_URL || getCookie("mongodb");
|
||||
const client = new MongoClient(url, {
|
||||
useNewUrlParser: true,
|
||||
useUnifiedTopology: true,
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
console.log(`Connected correctly to server`);
|
||||
const db = client.db(databaseName);
|
||||
|
||||
// Use the collection "data"
|
||||
const collection = db.collection(collectionName);
|
||||
|
||||
// Search options
|
||||
const query = ({});
|
||||
const options = ({});
|
||||
|
||||
// Insert a single document, wait for promise so we can read it back
|
||||
// const p = await collection.insertOne(metaforecastDocument);
|
||||
const documents = await collection.find().toArray()
|
||||
let documentNames = documents.map(document => ({name: document.name, roughSizeMBs: roughSizeOfObject(document)}));
|
||||
console.log(documentNames)
|
||||
}catch(error){
|
||||
console.log(error)
|
||||
}
|
||||
finally {
|
||||
await client.close();
|
||||
}
|
||||
|
||||
}
|
||||
//mongoGetAllElements()
|
||||
//mongoGetAllElements("metaforecastDatabase", "metaforecastHistory")
|
Loading…
Reference in New Issue
Block a user