Difference between revisions of "User:Abel/experimental.js"

From Wikibase Personal data
Jump to navigation Jump to search
m
m
Line 35: Line 35:
 
console.log("test: ")
 
console.log("test: ")
 
console.log(current_entity);
 
console.log(current_entity);
 +
 +
var h = new idxdbContainer( mw );
 +
h.EnqueuePDIO('update record', Date.now(), Date.now());
  
 
// for each match, render the corresponding ui elements
 
// for each match, render the corresponding ui elements
Line 260: Line 263:
 
 
 
}
 
}
 +
 +
 +
function idxdbContainer( ww ) {
 +
 +
hashCode = function(s) {
 +
var h = 0, l = s.length, i = 0;
 +
if ( l > 0 )
 +
while (i < l)
 +
h = (h << 5) - h + s.charCodeAt(i++) | 0;
 +
return h;
 +
};
 +
 +
if ( ww.user != undefined ) {
 +
var self = ww.user.getName();
 +
 +
var idgen = hashCode(self);
 +
 +
console.log(idgen);
 +
// Take username for standard databasename format
 +
var PersonalDataDataBaseName = "PD.IO" + idgen + "Database";
 +
// Use username in user to get up to date version of self
 +
var CurrentPerson = {id: idgen, name: {user: self}, age: 0};
 +
 +
console.log(PersonalDataDataBaseName);
 +
console.log(CurrentPerson);
 +
}
 +
 +
// ADD MORE DOC
 +
 +
// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
 +
// External accessible wrapper for Enquire
 +
 +
this.EnqueuePDIO = function( sw, c1, c2, c3 ) {
 +
return Enquire( PersonalDataDataBaseName, CurrentPerson, sw, c1, c2, c3 );
 +
}
 +
 +
// Enquire, a general purpose indexeddb update function with modes
 +
 +
// Mode 'aggressive push':
 +
// parameter record is pushed to database, overwriting whatever is there
 +
 +
// Mode 'checkin':
 +
// record is retrieved from database, parameter record is pushed if not found
 +
 +
// Mode 'get record'
 +
// tries to get record from db, returns undefined if not found
 +
 +
// Mode 'update record' field1 field2 field3
 +
// retrieve record, make record.field1.field2 = field3, push back
 +
 +
// Mode 'update record' field1 field2
 +
// retrieve record, make record.field1 = field2, push back
 +
 +
function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
 +
var pddb = window.indexedDB.open(pddbname, 3);
 +
pddb.onupgradeneeded = function() {
 +
var db = pddb.result;
 +
var store = db.createObjectStore(pddbname, {keyPath: "id"});
 +
 +
// shouldn't the index be the wiki.personaldata.io username?
 +
 +
var index = store.createIndex("NameIndex", ["id"]);
 +
};
 +
pddb.onsuccess = function() {
 +
var db = pddb.result;
 +
var tx = db.transaction(pddbname, "readwrite");
 +
var store = tx.objectStore(pddbname);
 +
var index = store.index("NameIndex");
 +
 +
// Get the original record from the db...
 +
var getRecord = index.get([record.id]);
 +
var inp_obj;
 +
 +
getRecord.onsuccess = function() {
 +
console.log( "Record found in database: \n <<");
 +
console.log( getRecord.result );
 +
console.log( ">>");
 +
 +
// Essential recordAdd
 +
if ( sqitch === "aggressive push" ) {
 +
inp_obj = record;
 +
store.put( inp_obj );
 +
return inp_obj;
 +
} else if ( sqitch === "checkin" ) {
 +
 +
if ( getRecord.result != undefined ) {
 +
console.log("getting from store");
 +
inp_obj = getRecord.result;
 +
} else {
 +
console.log("overriding whatever in there");
 +
inp_obj = record;
 +
store.put(inp_obj);
 +
}
 +
 +
} else {
 +
if ( getRecord.result != undefined ) {
 +
inp_obj = getRecord.result;
 +
if ( sqitch === "get record" ) {
 +
// if found, let's use that from now on
 +
console.log("Getting record");
 +
// let's return it so that our addrecord can be used as a getter as well
 +
return inp_obj;
 +
}
 +
//
 +
// endof onsuccess
 +
} else {
 +
console.log("record not found");
 +
if ( sqitch === "update record" ) {
 +
inp_obj = record;
 +
} else {
 +
return undefined;
 +
}
 +
}
 +
// endof resultdefined
 +
}
 +
// endofELSE
 +
if ( sqitch === "update record" ) { // Record Update
 +
if ( control_1 != undefined ) {
 +
if ( control_2 != undefined ) {
 +
if ( control_3 != undefined ) {
 +
 +
if ( Array.isArray( inp_obj[ control_1 ][ control_2 ] ) ) {
 +
inp_obj[ control_1 ][ control_2 ].push( control_3 );
 +
} else {
 +
inp_obj[ control_1 ][ control_2 ] = control_3; // => "Bob"
 +
}
 +
store.put(inp_obj);
 +
} else {
 +
 +
if ( Array.isArray( inp_obj[ control_1 ] ) ) {
 +
inp_obj[ control_1 ].push( control_2 );
 +
} else {
 +
inp_obj[ control_1 ] = control_2;
 +
}
 +
store.put(inp_obj);
 +
 +
}
 +
// +3
 +
} else {
 +
store.put(inp_obj);
 +
return inp_obj[ control_1 ];
 +
}
 +
// +2
 +
} else {
 +
 +
return inp_obj;
 +
 +
}
 +
 +
};
 +
 +
};
 +
};
 +
};
 +
};

Revision as of 18:41, 18 May 2019

// License: GPL
// Experimental Main
console.log("'⌣'");
var mwEStruct = {
		wbXntity: 'config.values.wbEntity'
	},

	language = "en",

	wbEStruct = {
		subclassOfRelations: 'claims.P4', // location of P4 relations in wbEntity
		defaultValRelation: 'claims.P108',
		concernsRelation: 'claims.P110',
		instanceOfRelations: 'claims.P3',
		IDPropLoc: 'mainsnak.datavalue.value', // location of ID properties in related entity
		IDName: 'numeric-id', // ID property name which checked 
		qIDPropName: 'id',
		standardValue: 'labels' + '.' + language + '.' + 'value'
	},

	relational_id_list = { 
			controller_id: [ wbEStruct['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 96 ],
			personal_data_id: [ wbEStruct['subclassOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 421 ],
			interface_button_id: [ wbEStruct ['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 487 ]
	};

var wbproc = new wbContainer(mw, mwEStruct['wbXntity']);

// Check whether the current page is in a relation of interest to an id of interest
var current_entity = wbproc.checkentity( relational_id_list );
// This should return an object of relations and ids

console.log( wbproc.xcontains( current_entity, relational_id_list['controller_id'][3] ) );

console.log("test: ")
console.log(current_entity);

var h = new idxdbContainer( mw );
h.EnqueuePDIO('update record', Date.now(), Date.now());

// for each match, render the corresponding ui elements
// current_entity.forEach(pdooui.render);

// License: GPL
// Wikibase Processor

	function wbContainer( universe, location ) {

		this.main = interjson( checkdive( universe, location ));
		var the = this.main;
		
		/* The following is the main exposed function of the current Wb Processing class
			usage cases

			to check the last value in a location given by a preceding array of internal paths to find, with the possibility of array layers between elements of array of paths: 
			wbproc.checkentity( [ wbEStruct['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 96 ] );

		*/

		this.checkentity = function ( paths ) {
			if ( ( the !== undefined ) && ( paths !== undefined ) ){
				return proceed( the, paths );
			}
		}

		// the list of private helper functions, could not be accessed from outside
		function indexinterpolate(obj,i) { return  (obj[i] !== undefined) ? obj[i] : obj}; 
		// helper function for checking a part of an array exists
		function indexcheck(obj,i) {  if ( obj !== undefined) { return ( obj[i] !== undefined ) ? obj[i] : undefined } };
		// dive selects matrix.a.b.c.d from the array called matrix and 'a.b.c.d' as string
		// if a.b.c.d does not exists, it returns the substructure until the substructure exists, if d does not exist, it returns matrix.a.b.c e.g.
		function dive(array, read){
			if ( array !== undefined ) {
				return (read + '').split('.').reduce(indexinterpolate, array);
			}
		}
		function check(array, read){
			if ( array !== undefined ) {
				return (read + '').split('.').reduce(indexcheck, array);
			}
		}

		function proceed(array, read) {
			var ret_obj = {},
			temp_obj = array,
			// Have a holder for instructional control return array
			success_o_meter = true,
			future_instructional_return = [];
			
//|||||||||||||||||||||||||||||||||||||||||||||||||||||[ I N S T R U C T I O N S  C O N T R O L   ]||||||||||||||||||||||||||||||||||||||||||||||||||||||

			// Init program, check if instructions are an object :
			if ( ( !Array.isArray(read) ) && ( Object.keys(read).length > 0 ) ) {

				
				Object.keys(read).forEach( function(path) {
				console.log("instructions are an object, in path " + path);

//||||||||||||||||||||||||||[ Check if elements of instruction object are arrays themselves ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
					
					if ( Array.isArray (read[path]) ) {
						var future_return_partition = temp_obj;
						Object.keys(read[path]).forEach( function( path2 ) {

							console.log("instructions are an array of arrays, going through " + read[ path ][ path2 ] );
							
							if ( data_function( future_return_partition, read[ path ][ path2 ] ) !== future_return_partition ){
								future_return_partition = data_function( future_return_partition, read[ path ][ path2 ] );
							} else {
								success_o_meter = false;
							}

//|||||||||||||||||||||||||||||||||||||||||||||||||||[   I N S T R U C T I O N S   C O N T R O L |||||||||||||||||||||||||||||||||||||||||||||||||||||||||

						});
						if ( success_o_meter === true ) {
						// Put the result of the travel along the paths in array element of array into the future_instructional_return bunch
							console.log("arrived at")
							console.log(future_return_partition);
							future_instructional_return.push(future_return_partition);
						} else {
							console.log("seeking derailed");
							success_o_meter = true;
							future_instructional_return.push( undefined );
						}

					} 

//|||||||||||||||||| If instruction object element is not an array anymore, lets just do one step ||||||||||||||||||||||||||||||||||||||||||||||||||||||||

					else {
												
						// INCLUDE step block with read[path] 
						if ( data_function( temp_obj, read[ path ] ) !== temp_obj  ){
							future_instructional_return.push( data_function( temp_obj, read[ path ] ) );
						} else {
							// future_instructional_return.push( undefined );
						}

					}
				});

				temp_obj = future_instructional_return;
			} 

//||||||||||||[ If we are not in instruction object, let's see if we have an instruction array ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

			else if ( Array.isArray(read) ) {
				// If so let's follow the array of instructions
				Object.keys( read ).forEach( function ( ect ) {
					if ( data_function( temp_obj, read[ ect ] ) !== temp_obj  ){
						
						temp_obj = data_function( temp_obj, read[ ect ] );

					} else {

						success_o_meter = false;

					}
				});
			} 

//||||||||||||[ If we have a single instruction, let's try following that |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

			else {
				
				if ( data_function( temp_obj, read ) !== temp_obj  ){
	
					temp_obj = data_function( temp_obj, read );

				} else {

					success_o_meter = false;

				}
			}
			// If we haven't got a not found signal along the way, let's try returning the object

			if ( success_o_meter === true ) {
				return temp_obj;
			} else {
				return undefined;
			}
		}

//|||||||||||||||||||||||||||||||||||||||||||||||||||||[   S T E P   B L O C K   ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

		function data_function ( temp_obj, moving ) {
			var future_temp_obj = [];
			if ( Array.isArray( temp_obj ) ) {
				console.log("data is on an array level");
				Object.keys( temp_obj ).forEach( function ( ect ) {
					
					// if we are on an array level in the data, lets iterate through the array
					
					console.log("Within partition: " + ect );
					if ( checkdive( temp_obj[ ect ], moving ) !== undefined ) {
						future_temp_obj.push( checkdive( temp_obj[ ect ], moving ) );
					}

				});
				temp_obj = future_temp_obj;
			
			} else {

				// if we are not on an array level, proceed with the path
				
				console.log("data is on an objective level");
				
				if ( checkdive( temp_obj, moving ) !== temp_obj ) {
					future_temp_obj = checkdive( temp_obj, moving );
				}
				if ( future_temp_obj !== undefined ){
					temp_obj = future_temp_obj;
				} else {
					console.log('nothing to see here')
				}

			}

			return temp_obj;
		}
							
//|||||||||||||||||||||||||||||||||||||||||||||||||||||[  E N D   O F   S T E P   B L O C K    ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

		wbContainer.prototype.xcontains = function ( unv, angle ) {
 		   return proceed( unv, angle );
		}

		function checkdive( array, read ){
			if ( check(array, read) !== undefined) {
				return dive(array, read);
			} 
			if ( Array.isArray(array) ) {
				var potential_return = [];
				Object.keys(array).forEach( function(item){
					if ( check(array[item], read) !== undefined ) {
						potential_return.push( dive( array[item], read) );
					}
				});
				return potential_return;
			}
			if ( array === read ) {
				return read;
			}
			/*
			if (Object.keys( array ).length > 0 ){
				Object.keys( array ).forEach( function ( piece ) {
					if ( array[ piece ] === read ) { return read };
				});
			}
			*/
		}

		function interjson( obj ) {
			try {
				return JSON.parse( obj )
			} catch (e) {
			// if not JSON, do silly things
				console.log('not a json ¯\_(ツ)_/¯');
			};
		} 
		
	}


function idxdbContainer( ww	) {
	
	hashCode = function(s) {
		var h = 0, l = s.length, i = 0;
		if ( l > 0 )
			while (i < l)
				h = (h << 5) - h + s.charCodeAt(i++) | 0;
			return h;
		};
		
		if ( ww.user != undefined ) {
			var self = ww.user.getName();
			
			var idgen = hashCode(self);																										

			console.log(idgen);
			// Take username for standard databasename format
			var PersonalDataDataBaseName = "PD.IO" + idgen + "Database";
			// Use username in user to get up to date version of self
			var CurrentPerson = {id: idgen, name: {user: self}, age: 0};
			
			console.log(PersonalDataDataBaseName);
			console.log(CurrentPerson);
		}

	// ADD MORE DOC

	// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
	// External accessible wrapper for Enquire
	
	this.EnqueuePDIO = function( sw, c1, c2, c3 ) {
		return Enquire( PersonalDataDataBaseName, CurrentPerson, sw, c1, c2, c3 );
	}

	// Enquire, a general purpose indexeddb update function with modes

	// Mode 'aggressive push':
	// parameter record is pushed to database, overwriting whatever is there

	// Mode 'checkin':
	// record is retrieved from database, parameter record is pushed if not found

	// Mode 'get record'
	// tries to get record from db, returns undefined if not found

	// Mode 'update record' field1 field2 field3
	// retrieve record, make record.field1.field2 = field3, push back

	// Mode 'update record' field1 field2
	// retrieve record, make record.field1 = field2, push back

	function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
		var pddb = window.indexedDB.open(pddbname, 3);
		pddb.onupgradeneeded = function() {
			var db = pddb.result;
			var store = db.createObjectStore(pddbname, {keyPath: "id"});

				// shouldn't the index be the wiki.personaldata.io username? 

				var index = store.createIndex("NameIndex", ["id"]);
		};
		pddb.onsuccess = function() {
			var db = pddb.result;
			var tx = db.transaction(pddbname, "readwrite");
			var store = tx.objectStore(pddbname);
			var index = store.index("NameIndex");	

			// Get the original record from the db...
			var getRecord = index.get([record.id]);
			var inp_obj;

			getRecord.onsuccess = function() {
				console.log( "Record found in database: \n <<");
				console.log( getRecord.result );
				console.log( ">>");

				// Essential recordAdd																													
				if ( sqitch === "aggressive push" ) {
					inp_obj = record;
					store.put( inp_obj );
					return inp_obj;
				} else if ( sqitch === "checkin" ) {
					
					if ( getRecord.result != undefined ) {
						console.log("getting from store");
						inp_obj = getRecord.result;
					} else {
						console.log("overriding whatever in there");
						inp_obj = record;
						store.put(inp_obj);
					}

				} else {
					if ( getRecord.result != undefined ) {		
						inp_obj = getRecord.result;
						if ( sqitch === "get record" ) {
							// if found, let's use that from now on
							console.log("Getting record");
							// let's return it so that our addrecord can be used as a getter as well
							return inp_obj;
						} 
							//
						// endof onsuccess
					} else {
						console.log("record not found");
						if ( sqitch === "update record" ) {
							inp_obj = record;
						} else {
							return undefined;
						}
					}
							// endof resultdefined	
				} 
						// endofELSE 
				if ( sqitch === "update record" ) { // Record Update															
					if ( control_1 != undefined ) {
						if ( control_2 != undefined ) {
							if ( control_3 != undefined ) {
								
								if ( Array.isArray( inp_obj[ control_1 ][ control_2 ] ) ) {
									inp_obj[ control_1 ][ control_2 ].push( control_3 );											
								} else {
									inp_obj[ control_1 ][ control_2 ] = control_3;	// => "Bob"
								}
								store.put(inp_obj);
							} else {
								
								if ( Array.isArray( inp_obj[ control_1 ] ) ) {
									inp_obj[ control_1 ].push( control_2 );
								} else {
									inp_obj[ control_1 ] = control_2;
								}
								store.put(inp_obj);

							}
							// +3 
						} else {
							store.put(inp_obj);
							return inp_obj[ control_1 ];
						}
							// +2
					} else {

						return inp_obj;

					}

				};

			};
		};
	};
};