Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
FP
 
 
 
 
doc
 
 
 
 
 
 

README.md

farse

Farse -- a parse clone

This is a proof of concept project to create a clone of the Parse backend ios sdk and web services.

The backend is modeled using Apache Solr, and a lightweight clone of the Parse iOS sdk is implemented in Objective C.

Read doc/farse.pdf for more information.

Example code:

- (IBAction)handleCreateAndSave:(id)sender {
    
    // create the object, giving it a "class name".
    // Using Parse, the object would be stored in a "table" with the name of the class.
    // In Solr, the object class name becomes a single field in each "document", named "className".
    // To facilitate retrieval within a single "table', queries can make use of Solr's faceted search
    // capabilities to cordon off a series of documents matching a specific "object type".
    
    FPObject *object = [FPObject objectWithClassName:@"GameScore"];
    
    // set values on the object, using string keys, which become field names in Solr
    // values can be typical primative json types, such as string, numbers, and boolean.
    object[@"score"] = @1337;
    object[@"cheatMode"] = @NO;
    object[@"playerName"] = @"Sean Plott";
    
    // save the object asyncronously to the solr backend
    [object saveInBackground];
    
    // for ease of retrieval in this demo, store the object's id into a property
    self.lastObjectId = object.objectId;
    
    // create another type of arbitrary object, "TopBands"
    // (with band name generated by the kramden.com bandname generator of course... )
    FPObject *bandObject = [FPObject objectWithClassName:@"TopBands"];
    bandObject[@"bandName"] = @"the mud besiegers";
    bandObject[@"numberOfSongs"] = @(arc4random() % 10);
    bandObject[@"hometown"] = @"New York";
    // save the object to the server
    [bandObject saveInBackground];
    
    // again, for ease of query in this demo, set last object id to use in future query
    self.lastBandObjectId = bandObject.objectId;
    
    
}

- (IBAction)handleQuery:(id)sender {
    
    // find a single object using the specified object id
    FPQuery *query = [FPQuery queryWithClassName:@"GameScore"];
    [query getObjectInBackgroundWithId:self.lastObjectId block:^(FPObject *object, NSError *error) {
        NSLog(@"object by id query complete %@",object);
        NSLog(@"name %@ score %@",object[@"playerName"],object[@"score"]);
    }];
    
    //alternatively  find all objects with field name GameScore
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        NSLog(@"multiple objects query complete: found %ld object(s)",objects.count);
        for (FPObject *o in objects) {
            NSLog(@"object: %@ - %@",o[@"playerName"],o[@"score"]);
        }
    }];
    
    // now do the same query but add a "where clause"
    [query whereKey:@"playerName" equalTo:@"Sean Plott"];
    
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        NSLog(@"multiple objects query complete: found %ld object(s)",objects.count);
        for (FPObject *o in objects) {
            NSLog(@"object: %@ - %@",o[@"playerName"],o[@"score"]);
        }
    }];
    
    
    // do a query against the "band" object type
    FPQuery *bandQuery = [FPQuery queryWithClassName:@"TopBands"];
    [bandQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        NSLog(@"multiple objects query complete: found %ld object(s)",objects.count);
        for (FPObject *o in objects) {
            NSLog(@"object: %@ - %@",o[@"bandName"],o[@"numberOfSongs"]);
        }
    }];
    
}

console output: ( after running it a few times, so duplicate objects exist)

created at Thu Nov 20 01:08:04 2014
2014-11-20 01:08:04.575 FP[27629:2280275] Saved object [{"numberOfSongs":2,"id":"UDfoK5l\/AAA","className":"TopBands","bandName":"the mud besiegers","hometown":"New York","createdAt":"Thu Nov 20 01:08:04 2014"}] 
2014-11-20 01:08:04.576 FP[27629:2280275] Saved object [{"id":"EFrnK5l\/AAA","className":"GameScore","score":1337,"cheatMode":false,"playerName":"Sean Plott","createdAt":"Thu Nov 20 01:08:04 2014"}] 
2014-11-20 01:08:06.511 FP[27629:2280275] object by id query complete <FPObject: 0x7f992bd56a00>
2014-11-20 01:08:06.511 FP[27629:2280275] name (
    "Sean Plott"
) score (
    1337
)
2014-11-20 01:08:06.511 FP[27629:2280275] multiple objects query complete: found 4 object(s)
2014-11-20 01:08:06.511 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)
2014-11-20 01:08:06.511 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)
2014-11-20 01:08:06.511 FP[27629:2280275] object: (
    "Sean Plott"
) - (null)
2014-11-20 01:08:06.511 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)
2014-11-20 01:08:06.511 FP[27629:2280275] multiple objects query complete: found 3 object(s)
2014-11-20 01:08:06.511 FP[27629:2280275] object: (
    "the mud besiegers"
) - (
    7
)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "the mud besiegers"
) - (
    0
)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "the mud besiegers"
) - (
    2
)
2014-11-20 01:08:06.512 FP[27629:2280275] multiple objects query complete: found 4 object(s)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "Sean Plott"
) - (null)
2014-11-20 01:08:06.512 FP[27629:2280275] object: (
    "Sean Plott"
) - (
    1337
)

About

a parse clone

Resources

License

Releases

No releases published
You can’t perform that action at this time.