dgraph icon indicating copy to clipboard operation
dgraph copied to clipboard

Please support val function on facets

Open ChStark opened this issue 5 years ago • 3 comments

What you wanted to do

If we have an upsert block like:

upsert{
  query{
   	product( func: uid( 0x12a4f4e ) ){
      wholesale_price as product.wholesale_price    
      wholesale_tax as product.wholesale_tax
      regular_price as product.regular_price
      regular_tax as product.regular_tax
  	}
    user( func: uid( 0x12a4f31 ) ){
      is_wholesaler as user.is_wholesaler
    }
  }
  mutation @if( eq( val(is_wholesaler) , true ) ){
    set{
      <0x12a4f31> <user.orders> <0x12a4f55> .
      <0x12a4f55> <order.products> <0x12a4f4e> (quantity=5, price=val(wholesale_price), tax=val(wholesale_tax) ) .
    }
  }
  mutation @if( not( eq( val(is_wholesaler) , true ) ) ){
    set{
      <0x12a4f31> <user.orders> <0x12a4f55> .
      <0x12a4f55> <order.products> <0x12a4f4e> (quantity=5, price=val(regular_price), tax=val(regular_tax) ) .
    }
  }
} 

It wont work since the val function is not supported on facets

What you actually did

The work around is to do a 2 part job, one to query the data and one to do the mutation, but since dgraph wants to reduce the network trips, I thinks this should be supported

Why that wasn't great, with examples

It wasn't great that I had to handle more logic on the app just because the QL doesn't support the parsing of a function

ChStark avatar Jan 08 '20 14:01 ChStark

Although issue #1996's proposal is different, it has a similar goal.

https://github.com/dgraph-io/dgraph/issues/1996

MichelDiz avatar Jan 08 '20 16:01 MichelDiz

Maybe we can achieve the goal of both issues changing the syntaxis (have inmmutability and consistency on the edge attributes and the ability to use val)

upsert{
  query{
   	product( func: uid( 0x12a4f4e ) ){
      wholesale_price as product.wholesale_price    
      wholesale_tax as product.wholesale_tax
      regular_price as product.regular_price
      regular_tax as product.regular_tax
  	}
    user( func: uid( 0x12a4f31 ) ){
      is_wholesaler as user.is_wholesaler
    }
  }
  mutation @if( eq( val(is_wholesaler) , true ) ){
    set{
      <0x12a4f31> <user.orders> <0x12a4f55> .
      <0x12a4f55> <order.products> <0x12a4f4e> (quantity=5, price=val(wholesale_price), tax=val(wholesale_tax) ) .
    }
  }
  mutation @if( not( eq( val(is_wholesaler) , true ) ) ){
    set{
      <0x12a4f31> <user.orders> <0x12a4f55> .
      <0x12a4f55> <order.products> <0x12a4f4e> 5#quantity .
      <0x12a4f55> <order.products> <0x12a4f4e> val(regular_price)#price .
      <0x12a4f55> <order.products> <0x12a4f4e> val(regular_tax)#tax .
    }
  }
} 

Doing something like this we can have something that currently works ( val on values of nquad ) and indicate to the parser what specific facet we want to mutate to change only that one and not to mutate the other ones

ChStark avatar Jan 09 '20 00:01 ChStark

Github issues have been deprecated. This issue has been moved to discuss. You can follow the conversation there and also subscribe to updates by changing your notification preferences.

drawing

minhaj-shakeel avatar Jul 20 '20 19:07 minhaj-shakeel