// in main DB concept Slice { GlobalID globalID = aGlobalIDObject(); S caseID; S name; long sliceDumped; // wall time, set before dump starts bool indexed = true; S defaultCaseID() { ret uniqueFileNameUsingMD5_80_v2(name + " " + globalID); } } // in any DB concept Page { S globalID = aGlobalID(); S url, q; } abstract concept AbstractEntry { new Ref page; int count; S key; S ip; new Ref signer; } concept Entry > AbstractEntry { S globalID = aGlobalID(); // TODO: migrate to object S value; } concept MultiLineEntry > AbstractEntry { GlobalID globalID = aGlobalIDObject(); S value; } concept BlobEntry > AbstractEntry { GlobalID globalID = aGlobalIDObject(); long length; S md5; } // in main DB? concept Signer { S globalID = aGlobalID(); S publicKey; bool trusted; S approvedBy; } // in main DB concept Session { S cookie; S selectedSlice; // global ID Page slicePage; // phasing out long googleLogInDate; S googleEmail, googleFirstName, googleLastName; bool googleEmailVerified; } // singleton concept in every DB concept SliceInfo { GlobalID globalID; LS mandatoryBotVMBusIDs; } sclass CentralIndexEntry { Set slices = synchroLinkedHashSet(); } // global constants sclass LoadedSlice { // non-persistent class S caseID; Concepts cc; Slice sliceConcept; long lastAccess = sysNow(); ConceptFieldIndexDesc idx_latestEntries, idx_latestCreatedPages, idx_latestChangedPages; *(S *caseID, Concepts *cc) { indexThings(); // forward changes to Slice concept onConceptsChange(cc, r { cset(sliceConcept, _modified := now()) }); if (makeAllValuesPages && legacy) for (Entry e : list(cc, Entry)) pageFromQ(e.value); } void initialSetup(GlobalID globalID) { SliceInfo info = uniq(cc, SliceInfo); cset(info, +globalID); } // create if not there Page pageFromQ(S q) { ret main.pageFromQ(cc, q); } void indexThings() { indexConceptFieldsCI(cc, Page, 'url, Page, 'q, Entry, 'key, Entry, 'value); indexConceptFields(cc, Signer, 'publicKey); indexConceptFields(cc, Session, 'cookie); indexSingletonConcept(cc, SliceInfo); idx_latestCreatedPages = new ConceptFieldIndexDesc(cc, Page, 'created); idx_latestChangedPages = new ConceptFieldIndexDesc(cc, Page, '_modified); idx_latestEntries = new ConceptFieldIndexDesc(cc, Entry, 'created); } bool isMainSlice() { ret empty(caseID); } GlobalID globalID() { ret sliceConcept.globalID; } }