TechStacks Cocoa Desktop App powered by AutoQuery for OSX
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

TechStacks Desktop Cocoa OSX App

The TechStacks OSX Desktop App is built around 2 AutoQuery Services showing how much querying functionality AutoQuery Services provides for free and how easy they are to call with ServiceStack's new support for Swift and XCode.

Behind the scenes the TechStacks Desktop app is essentially powered withby these 2 AutoQuery Services:

[Query(QueryTerm.Or)] //change from filtering (default) to combinatory semantics
public class FindTechStacks : QueryDb<TechnologyStack> {}

public class FindTechnologies : QueryDb<Technology> {}

Basically just a Request DTO telling AutoQuery what Table we want to Query and that we want to change the default Search behavior to have OR semantics. We don't need to specify which properties we can query as the implicit conventions automatically infer it from the table being queried.

The TechStacks Desktop UI is then built around these 2 AutoQuery Services allowing querying against each field and utilizing a common subset of the implicit conventions supported:

Querying Technology Stacks

TechStack Desktop Search Fields

Querying Technologies

TechStack Desktop Search Type

Like the TechStacks iOS App all Service Calls are maintained in a single AppData.swift class and uses KVO bindings to update its UI which is populated from these 2 services below:

func searchTechStacks(_ query:String, field:String? = nil, operand:String? = nil) 
  -> Promise<QueryResponse<TechnologyStack>> { = query

    let queryString = query.count > 0 && field != nil && operand != nil
        ? [createAutoQueryParam(field!, operand!): query]
        : ["NameContains":query, "DescriptionContains":query]

    let request = FindTechStacks<TechnologyStack>()
    return client.getAsync(request, query:queryString)
        .then { r -> QueryResponse<TechnologyStack> in
            self.filteredTechStacks = r.results
            return r

func searchTechnologies(_ query:String, field:String? = nil, operand:String? = nil) 
  -> Promise<QueryResponse<Technology>> { = query

    let queryString = query.count > 0 && field != nil && operand != nil
        ? [createAutoQueryParam(field!, operand!): query]
        : ["NameContains":query, "DescriptionContains":query]

    let request = FindTechnologies<Technology>()
    return client.getAsync(request, query:queryString)
        .then { r -> QueryResponse<Technology> in
            self.filteredTechnologies = r.results
            return r

func createAutoQueryParam(field:String, _ operand:String) -> String {
    let template = autoQueryOperandsMap[operand]!
    let mergedField = template.replace("%", withString:field)
    return mergedField

Essentially employing the same strategy for both AutoQuery Services where it builds a query String parameter to send with the request. For incomplete queries, the default search queries both NameContains and DescriptionContains field conventions returning results where the Search Text is either in Name OR Description fields.