void testMetaSequence_serialisation(CuTest* testCase) { cactusMetaSequenceTestSetup(); int64_t i; Name name = metaSequence_getName(metaSequence); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, name) == metaSequence); void *vA = binaryRepresentation_makeBinaryRepresentation(metaSequence, (void (*)(void *, void (*)(const void *, size_t, size_t)))metaSequence_writeBinaryRepresentation, &i); CuAssertTrue(testCase, i > 0); metaSequence_destruct(metaSequence); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, name) == NULL); void *vA2 = vA; metaSequence = metaSequence_loadFromBinaryRepresentation(&vA2, cactusDisk); CuAssertTrue(testCase, name == metaSequence_getName(metaSequence)); CuAssertStrEquals(testCase, headerString, metaSequence_getHeader(metaSequence)); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, name) == metaSequence); cactusDisk_write(cactusDisk); metaSequence_destruct(metaSequence); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, name) != NULL); metaSequence = cactusDisk_getMetaSequence(cactusDisk, name); nestedTest = 1; testMetaSequence_getName(testCase); testMetaSequence_getStart(testCase); testMetaSequence_getLength(testCase); testMetaSequence_getEventName(testCase); testMetaSequence_getString(testCase); testMetaSequence_getHeader(testCase); testMetaSequence_isTrivialSequence(testCase); nestedTest = 0; cactusMetaSequenceTestTeardown(); }
static int64_t setCoordinates(Flower *flower, MetaSequence *metaSequence, Cap *cap, int64_t coordinate) { /* * Sets the coordinates of the reference thread and sets the bases of the actual sequence * that of the consensus. */ Sequence *sequence = flower_getSequence(flower, metaSequence_getName(metaSequence)); if (sequence == NULL) { sequence = sequence_construct(metaSequence, flower); } while (1) { assert(cap_getStrand(cap)); assert(!cap_getSide(cap)); Cap *adjacentCap = cap_getAdjacency(cap); assert(adjacentCap != NULL); assert(cap_getStrand(adjacentCap)); assert(cap_getSide(adjacentCap)); int64_t adjacencyLength = cap_getCoordinate(cap); assert(adjacencyLength == cap_getCoordinate(adjacentCap)); assert(adjacencyLength != INT64_MAX); assert(adjacencyLength >= 0); cap_setCoordinates(cap, coordinate, 1, sequence); coordinate += adjacencyLength + 1; cap_setCoordinates(adjacentCap, coordinate, 1, sequence); //Traverse any block.. if ((cap = cap_getOtherSegmentCap(adjacentCap)) == NULL) { break; } coordinate += segment_getLength(cap_getSegment(adjacentCap)) - 1; } return coordinate; }
void metaSequence_writeBinaryRepresentation(MetaSequence *metaSequence, void (*writeFn)(const void * ptr, size_t size, size_t count)) { binaryRepresentation_writeElementType(CODE_META_SEQUENCE, writeFn); binaryRepresentation_writeName(metaSequence_getName(metaSequence), writeFn); binaryRepresentation_writeInteger(metaSequence_getStart(metaSequence), writeFn); binaryRepresentation_writeInteger(metaSequence_getLength(metaSequence), writeFn); binaryRepresentation_writeName(metaSequence_getEventName(metaSequence), writeFn); binaryRepresentation_writeName(metaSequence->stringName, writeFn); binaryRepresentation_writeString(metaSequence_getHeader(metaSequence), writeFn); binaryRepresentation_writeBool(metaSequence_isTrivialSequence(metaSequence), writeFn); }
static Segment *getSegment(stSortedSet *sortedSegments, int64_t x, MetaSequence *metaSequence) { segmentCompareFn_coordinate = x; segmentCompareFn_metaSequence = metaSequence_getName(metaSequence); Segment *segment = stSortedSet_searchLessThanOrEqual(sortedSegments, &segmentCompareFn_coordinate); assert((void *) segment != &segmentCompareFn_coordinate); if (segment != NULL) { if(sequence_getMetaSequence(segment_getSequence(segment)) == metaSequence) { assert(segment_getStart(segment) <= x); if (x < segment_getStart(segment) + segment_getLength(segment)) { return segment; } } } return NULL; }
void testCactusDisk_getMetaSequence(CuTest* testCase) { cactusDiskTestSetup(); MetaSequence *metaSequence = metaSequence_construct(1, 10, "ACTGACTGAG", "FOO", 10, cactusDisk); MetaSequence *metaSequence2 = metaSequence_construct(2, 10, "CCCCCCCCCC", "BAR", 10, cactusDisk); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, metaSequence_getName(metaSequence)) == metaSequence); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, metaSequence_getName(metaSequence2)) == metaSequence2); //now try closing the disk, then reloading it, to see if we get the same result. Name name1 = metaSequence_getName(metaSequence); Name name2 = metaSequence_getName(metaSequence2); cactusDisk_write(cactusDisk); cactusDisk_destruct(cactusDisk); cactusDisk = cactusDisk_construct(conf, 0); metaSequence = cactusDisk_getMetaSequence(cactusDisk, name1); metaSequence2 = cactusDisk_getMetaSequence(cactusDisk, name2); CuAssertTrue(testCase, metaSequence != NULL); CuAssertTrue(testCase, metaSequence2 != NULL); CuAssertTrue(testCase, metaSequence_getName(metaSequence) == name1); CuAssertTrue(testCase, metaSequence_getName(metaSequence2) == name2); cactusDiskTestTeardown(); }
void cactusDisk_write(CactusDisk *cactusDisk) { Flower *flower; int64_t recordSize; stList *removeRequests = stList_construct3(0, (void (*)(void *)) stIntTuple_destruct); st_logDebug("Starting to write the cactus to disk\n"); stSortedSetIterator *it = stSortedSet_getIterator(cactusDisk->flowers); //Sort flowers to update. while ((flower = stSortedSet_getNext(it)) != NULL) { cactusDisk_addUpdateRequest(cactusDisk, flower); } stSortedSet_destructIterator(it); st_logDebug("Got the flowers to update\n"); //Remove nets that are marked for deletion.. it = stSortedSet_getIterator(cactusDisk->flowerNamesMarkedForDeletion); char *nameString; while ((nameString = stSortedSet_getNext(it)) != NULL) { Name name = cactusMisc_stringToName(nameString); if (containsRecord(cactusDisk, name)) { stList_append(cactusDisk->updateRequests, stKVDatabaseBulkRequest_constructUpdateRequest(name, &name, 0)); //We set it to null in the first atomic operation. stList_append(removeRequests, stIntTuple_construct1(name)); } } stSortedSet_destructIterator(it); st_logDebug("Avoided updating nets marked for deletion\n"); // Insert and/or update meta-sequences. it = stSortedSet_getIterator(cactusDisk->metaSequences); MetaSequence *metaSequence; while ((metaSequence = stSortedSet_getNext(it)) != NULL) { void *vA = binaryRepresentation_makeBinaryRepresentation(metaSequence, (void (*)(void *, void (*)(const void * ptr, size_t size, size_t count))) metaSequence_writeBinaryRepresentation, &recordSize); //Compression vA = compress(vA, &recordSize); if (!containsRecord(cactusDisk, metaSequence_getName(metaSequence))) { stList_append(cactusDisk->updateRequests, stKVDatabaseBulkRequest_constructInsertRequest(metaSequence_getName(metaSequence), vA, recordSize)); } else { stList_append(cactusDisk->updateRequests, stKVDatabaseBulkRequest_constructUpdateRequest(metaSequence_getName(metaSequence), vA, recordSize)); } free(vA); } stSortedSet_destructIterator(it); st_logDebug("Got the sequences we are going to add to the database.\n"); if (!containsRecord(cactusDisk, CACTUS_DISK_PARAMETER_KEY)) { //We only write the parameters once. //Finally the database info. void *cactusDiskParameters = binaryRepresentation_makeBinaryRepresentation(cactusDisk, (void (*)(void *, void (*)(const void * ptr, size_t size, size_t count))) cactusDisk_writeBinaryRepresentation, &recordSize); //Compression cactusDiskParameters = compress(cactusDiskParameters, &recordSize); stList_append(cactusDisk->updateRequests, stKVDatabaseBulkRequest_constructInsertRequest(CACTUS_DISK_PARAMETER_KEY, cactusDiskParameters, recordSize)); free(cactusDiskParameters); } st_logDebug("Checked if need to write the initial parameters\n"); if (stList_length(cactusDisk->updateRequests) > 0) { st_logDebug("Going to write %" PRIi64 " updates\n", stList_length(cactusDisk->updateRequests)); stTry { st_logDebug("Writing %" PRIi64 " updates\n", stList_length(cactusDisk->updateRequests)); assert(stList_length(cactusDisk->updateRequests) > 0); stKVDatabase_bulkSetRecords(cactusDisk->database, cactusDisk->updateRequests); } stCatch(except) { stThrowNewCause(except, ST_KV_DATABASE_EXCEPTION_ID, "Failed when trying to set records in updating the cactus disk"); }stTryEnd ; }
static int cactusDisk_constructMetaSequencesP(const void *o1, const void *o2) { return cactusMisc_nameCompare(metaSequence_getName((MetaSequence *) o1), metaSequence_getName((MetaSequence *) o2)); }
static int segmentCompareFn(const void *segment1, const void *segment2) { Name name1 = segment1 == &segmentCompareFn_coordinate ? segmentCompareFn_metaSequence : metaSequence_getName(sequence_getMetaSequence(segment_getSequence((Segment *)segment1))); Name name2 = segment2 == &segmentCompareFn_coordinate ? segmentCompareFn_metaSequence : metaSequence_getName(sequence_getMetaSequence(segment_getSequence((Segment *)segment2))); int i = cactusMisc_nameCompare(name1, name2); if(i == 0) { int64_t x = segment1 == &segmentCompareFn_coordinate ? segmentCompareFn_coordinate : (int64_t) segment_getStart((void *) segment1); int64_t y = segment2 == &segmentCompareFn_coordinate ? segmentCompareFn_coordinate : (int64_t) segment_getStart((void *) segment2); assert( segment1 == &segmentCompareFn_coordinate || segment_getStrand( (void *) segment1)); assert( segment2 == &segmentCompareFn_coordinate || segment_getStrand( (void *) segment2)); return x > y ? 1 : (x < y ? -1 : 0); //i > 0 ? 1 : i < 0 ? -1 : 0; //This was because of an overflow } return i; }
Name sequence_getName(Sequence *sequence) { return metaSequence_getName(sequence->metaSequence); }
void testMetaSequence_getName(CuTest* testCase) { cactusMetaSequenceTestSetup(); CuAssertTrue(testCase, metaSequence_getName(metaSequence) != NULL_NAME); CuAssertTrue(testCase, cactusDisk_getMetaSequence(cactusDisk, metaSequence_getName(metaSequence)) == metaSequence); cactusMetaSequenceTestTeardown(); }