This repository has been archived by the owner on Mar 26, 2021. It is now read-only.
/
insert.go
64 lines (61 loc) · 1.6 KB
/
insert.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package db
import (
sparql "github.com/gtfierro/hod/lang/ast"
"github.com/gtfierro/hod/turtle"
"time"
)
func (db *DB) handleInsert(insert sparql.InsertClause, result QueryResult) (queryStats, error) {
insertStart := time.Now()
var additions turtle.DataSet
var stats queryStats
for _, insertTerm := range insert.Terms {
if result.Count == 0 {
additions.AddTripleURIs(insertTerm.Subject, insertTerm.Predicates[0].Predicate, insertTerm.Object)
} else {
for _, row := range result.Rows {
newterm := insertTerm.Copy()
// replace all variables with content from query
if newterm.Subject.IsVariable() {
if value, found := row[newterm.Subject.Value]; found {
newterm.Subject = value
}
}
pred := newterm.Predicates[0].Predicate
if pred.IsVariable() {
if value, found := row[pred.Value]; found {
newterm.Predicates[0].Predicate = value
}
}
if newterm.Object.IsVariable() {
if value, found := row[newterm.Object.Value]; found {
newterm.Object = value
}
}
additions.AddTripleURIs(newterm.Subject, newterm.Predicates[0].Predicate, newterm.Object)
stats.NumInserted += 1
}
}
}
tx, err := db.openTransaction()
if err != nil {
tx.discard()
return stats, err
}
if err := tx.addTriples(additions); err != nil {
tx.discard()
return stats, err
}
if err := tx.done(); err != nil {
tx.discard()
return stats, err
}
if err := db.buildTextIndex(additions); err != nil {
return stats, err
}
err = db.saveIndexes()
if err != nil {
return stats, err
}
stats.InsertTime = time.Since(insertStart)
return stats, nil
}