Skip to content

Commit

Permalink
update to latest ichiban/prolog ver
Browse files Browse the repository at this point in the history
  • Loading branch information
guregu committed Mar 22, 2022
1 parent c57052c commit b103dc9
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 61 deletions.
1 change: 1 addition & 0 deletions dynamodb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ get_item(table, userid-n(42)-&-date-s('2022'), Item).
## TODO
- [ ] `query/3`
- [ ] `delete_item/2`
- [ ] `update_item/?`
- [ ] `describe_table/2`
- [ ] options: conditions, filters, expressions (`query/4` etc.)
- [ ] transactions
1 change: 1 addition & 0 deletions dynamodb/dynamo.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func (d Dynamo) Bootstrap(p *prolog.Interpreter) {
:- built_in(scan/2).
:- built_in(get_item/3).
:- built_in(put_item/2).
:- built_in(delete_item/2).
:- built_in(attribute_value/2).
`); err != nil {
panic(err)
Expand Down
6 changes: 5 additions & 1 deletion dynamodb/example.pl
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@

:- between(1,3,X), put_item('TestDB', ['UserID'-n(X), 'Time'-s('400')]).

:- put_item('foo', [id-n(1)]).
:- put_item('foo', [id-n(1)]).

abc :- fail,
query(table, foo-s(bar)-&-baz-s(x), Item).
%query(table, (foo = bar, baz = x))
117 changes: 61 additions & 56 deletions dynamodb/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package dynamodb

import (
"encoding/base64"
"log"
"sort"
"strconv"
"strings"
Expand Down Expand Up @@ -162,19 +161,21 @@ func prolog2av(v engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error)
return nil, internal.TypeErrorAtom(arg)
case "bs":
av := &dynamodb.AttributeValue{BS: [][]byte{}}
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
switch elem := env.Resolve(elem).(type) {
case engine.Atom:
b, err := base64.StdEncoding.DecodeString(string(elem))
if err != nil {
return err
return nil, err
}
av.BS = append(av.BS, b)
return nil
default:
return nil, internal.TypeErrorAtom(elem)
}
return internal.TypeErrorAtom(elem)
}, env)
return av, err
}
return av, iter.Err()
case "bool":
if a, ok := arg.(engine.Atom); ok {
switch a {
Expand Down Expand Up @@ -203,15 +204,17 @@ func prolog2av(v engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error)
return nil, internal.TypeErrorAtom(arg)
case "ns":
av := &dynamodb.AttributeValue{NS: []*string{}}
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
switch elem := env.Resolve(elem).(type) {
case engine.Atom:
av.NS = append(av.NS, aws.String(string(elem)))
return nil
default:
return nil, internal.TypeErrorAtom(elem)
}
return internal.TypeErrorAtom(elem)
}, env)
return av, err
}
return av, iter.Err()
case "null":
if a, ok := arg.(engine.Atom); ok && a == "true" {
return &dynamodb.AttributeValue{NULL: aws.Bool(true)}, nil
Expand All @@ -224,37 +227,40 @@ func prolog2av(v engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error)
return nil, internal.TypeErrorAtom(arg)
case "ss":
av := &dynamodb.AttributeValue{SS: []*string{}}
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
switch elem := env.Resolve(elem).(type) {
case engine.Atom:
av.SS = append(av.SS, aws.String(string(elem)))
return nil
default:
return nil, internal.TypeErrorAtom(elem)
}
return internal.TypeErrorAtom(elem)
}, env)
return av, err
}
return av, iter.Err()

case ".":
// prolog list
// try to figure out if it's a M like [foo-bar] or L like [foo]
// TODO: maybe this is dumb idk

isMap := true
engine.EachList(v, func(elem engine.Term) error {
if !isMap {
return nil
}
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
cmp, ok := env.Resolve(elem).(*engine.Compound)
if !ok {
isMap = false
return nil
break
}
if cmp.Functor != "-" || len(cmp.Args) != 2 {
log.Println(cmp.Functor, cmp.Args)
isMap = false
break
}
return nil
}, env)
}
if err := iter.Err(); err != nil {
return nil, err
}

if isMap {
return makemap(v, env)
Expand All @@ -269,32 +275,34 @@ func prolog2av(v engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error)

func makemap(arg engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error) {
av := &dynamodb.AttributeValue{M: map[string]*dynamodb.AttributeValue{}}
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
key, val, err := splitkey(env.Resolve(elem), env)
if err != nil {
return err
return nil, err
}
avv, err := prolog2av(val, env)
if err != nil {
return err
return nil, err
}
av.M[key] = avv
return nil
}, env)
return av, err
}
return av, iter.Err()
}

func makelist(arg engine.Term, env *engine.Env) (*dynamodb.AttributeValue, error) {
av := &dynamodb.AttributeValue{L: []*dynamodb.AttributeValue{}}
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
item, err := prolog2av(env.Resolve(elem), env)
if err != nil {
return err
return nil, err
}
av.L = append(av.L, item)
return nil
}, env)
return av, err
}
return av, iter.Err()
}

func simplify(v engine.Term, env *engine.Env) (engine.Term, error) {
Expand All @@ -312,37 +320,33 @@ func simplify(v engine.Term, env *engine.Env) (engine.Term, error) {
switch v.Functor {
case "l":
list := make([]engine.Term, 0)
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
val, err := simplify(elem, env)
if err != nil {
return err
return nil, err
}
list = append(list, val)
return nil
}, env)
if err != nil {
return nil, err
}
return engine.List(list...), nil
return engine.List(list...), iter.Err()
case "m":
list := make([]engine.Term, 0)
err := engine.EachList(arg, func(elem engine.Term) error {
iter := engine.ListIterator{List: arg, Env: env}
for iter.Next() {
elem := iter.Current()
key, val, err := splitkey(env.Resolve(elem), env)
if err != nil {
return err
return nil, err
}
sv, err := simplify(val, env)
if err != nil {
return err
return nil, err
}
member := engine.Atom("-").Apply(engine.Atom(key), sv)
list = append(list, member)
return nil
}, env)
if err != nil {
return nil, err
}
return engine.List(list...), nil
return engine.List(list...), iter.Err()
case "n":
switch x := arg.(type) {
case engine.Atom:
Expand Down Expand Up @@ -379,15 +383,16 @@ func simplify(v engine.Term, env *engine.Env) (engine.Term, error) {

func list2item(list engine.Term, env *engine.Env) (map[string]*dynamodb.AttributeValue, error) {
avs := make(map[string]*dynamodb.AttributeValue)
err := engine.EachList(env.Resolve(list), func(elem engine.Term) error {
iter := engine.ListIterator{List: env.Resolve(list), Env: env}
for iter.Next() {
elem := iter.Current()
key, av, err := parsekey(env.Resolve(elem), env)
if err != nil {
return err
return nil, err
}
avs[key] = av
return nil
}, env)
return avs, err
}
return avs, iter.Err()
}

func tableName(table engine.Term) (string, *engine.Exception) {
Expand Down
10 changes: 7 additions & 3 deletions fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,13 @@ func (ff FS) Consult(files engine.Term, k func(*engine.Env) *engine.Promise, env
return engine.Error(engine.ErrInstantiation)
case *engine.Compound:
if f.Functor == "." && len(f.Args) == 2 {
if err := engine.EachList(f, func(elem engine.Term) error {
return ff.consultOne(elem, env)
}, env); err != nil {
iter := engine.ListIterator{List: f, Env: env}
for iter.Next() {
if err := ff.consultOne(iter.Current(), env); err != nil {
return engine.Error(err)
}
}
if err := iter.Err(); err != nil {
return engine.Error(err)
}
return k(env)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/aws/aws-sdk-go v1.42.47
github.com/google/go-cmp v0.5.7
github.com/guregu/dynamo v1.14.0
github.com/ichiban/prolog v0.8.1-0.20220301002125-6d174c70bca7
github.com/ichiban/prolog v0.8.1-0.20220321233827-0effc44aae01
)

require (
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ github.com/guregu/dynamo v1.14.0 h1:AQ+02e0t0Wd6QqaTJ5tv6Go80NQz7bYoskX2lor6gyA=
github.com/guregu/dynamo v1.14.0/go.mod h1:R5fw2cfeTXQgoIXNNvNIDKf+k6G65cKZ+IfFs0lGyUQ=
github.com/ichiban/prolog v0.8.1-0.20220301002125-6d174c70bca7 h1:eDGX9DH+aqM+zad1a8IkLDUdywlhrkFZAh0MLYxq8x8=
github.com/ichiban/prolog v0.8.1-0.20220301002125-6d174c70bca7/go.mod h1:qB0m6pWsd/XghbWmS5D6GExVhEvNqsa+iBPFMpTxS+U=
github.com/ichiban/prolog v0.8.1-0.20220321233827-0effc44aae01 h1:dEL1TfJ9kBZF9WYtEFs4SYVlRc/PFNkn08qW7dTXEvI=
github.com/ichiban/prolog v0.8.1-0.20220321233827-0effc44aae01/go.mod h1:qB0m6pWsd/XghbWmS5D6GExVhEvNqsa+iBPFMpTxS+U=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
Expand Down

0 comments on commit b103dc9

Please sign in to comment.