Exemplo n.º 1
0
func (store *MySQLStore) Filter(subjSearch, predSearch, objSearch argo.Term) (ch chan *argo.Triple) {
	ch = make(chan *argo.Triple)

	queryClauses := make([]string, 0)
	queryValues := make([]interface{}, 0)

	if subjSearch != nil {
		subjectID := store.encodeSubject(subjSearch)

		queryClauses = append(queryClauses, "subject = ?")
		queryValues = append(queryValues, subjectID)
	}

	if predSearch != nil {
		predicatePrefixID, predicateLocal := store.encodePredicate(predSearch)

		queryClauses = append(queryClauses, "predicatePrefix = ?")
		queryClauses = append(queryClauses, "predicateLocal = ?")
		queryValues = append(queryValues, predicatePrefixID)
		queryValues = append(queryValues, predicateLocal)
	}

	if objSearch != nil {
		objectIsLiteral, objectID := store.encodePredicate(objSearch)

		queryClauses = append(queryClauses, "objectIsLiteral = ?")
		queryClauses = append(queryClauses, "object = ?")
		queryValues = append(queryValues, objectIsLiteral)
		queryValues = append(queryValues, objectID)
	}

	whereStr := ""
	if len(queryClauses) > 0 {
		whereStr = " WHERE " + strings.Join(queryClauses, " AND ")
	}

	resultChan, failChan := store.execute("SELECT subject, predicatePrefix, predicateLocal, objectIsLiteral, object FROM %s_triples"+whereStr, queryValues...)

	go func() {
		for row := range resultChan {
			var subject, predicate, object argo.Term

			if subjSearch == nil {
				subject = store.decodeSubject(row[0].(uint64))
			} else {
				subject = subjSearch
			}

			if predSearch == nil {
				predicate = store.decodePredicate(row[1].(uint64), row[2].(string))
			} else {
				predicate = predSearch
			}

			if objSearch == nil {
				object = store.decodeObject(row[3].(uint8), row[4].(uint64))
			} else {
				object = objSearch
			}

			ch <- argo.NewTriple(subject, predicate, object)
		}

		<-failChan
		close(ch)
	}()

	return ch
}
Exemplo n.º 2
0
func (store *MySQLStore) decodeTriple(subjectID uint64, predicatePrefixID uint64, predicateLocal string, objectIsLiteral uint8, objectID uint64) (triple *argo.Triple) {
	return argo.NewTriple(store.decodeSubject(subjectID), store.decodePredicate(predicatePrefixID, predicateLocal), store.decodeObject(objectIsLiteral, objectID))
}