[ 
https://issues.apache.org/jira/browse/SOLR-11600?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16260797#comment-16260797
 ] 

Amrit Sarkar edited comment on SOLR-11600 at 11/21/17 2:34 PM:
---------------------------------------------------------------

Thank you [~joel.bernstein] for the explanation; 

bq. Each expression has it's own set of rules for the parameters that it 
accepts so we can get very specific with how type safety is handled
I completely understand this by the following example
{code}
replace( fieldA, add( fieldB, if( eq(fieldC,0), 0, 1)))
{code}
This nested evaluation and operation is not possible to create with current 
Java constructors available, as the constructors of evaluators and operations 
have most just one type of constructor with {{StreamExpression}} 
(StreamExpressionParameter interface) parameter which the evaluators or 
operators doesn't implement (they implement Expressible interface).
{code}
  public AddEvaluator(StreamExpression expression, StreamFactory factory) 
throws IOException{
    super(expression, factory);
    
    if(containedEvaluators.size() < 1){
      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - 
expecting at least one value but found 
%d",expression,containedEvaluators.size()));
    }
  }
{code}

To accomodate the above request, strongly types java objects for all, we need 
to create rule-based constructors for all the evaluators and operators, so that 
those can be used in {{SelectStream}}.


was (Author: sarkaramr...@gmail.com):
Thank you [~joel.bernstein] for the explanation; 

> Each expression has it's own set of rules for the parameters that it accepts 
> so we can get very specific with how type safety is handled
I completely understand this by the following example
{code}
replace( fieldA, add( fieldB, if( eq(fieldC,0), 0, 1)))
{code}
This nested evaluation and operation is not possible to create with current 
Java constructors available, as the constructors of evaluators and operations 
have most just one type of constructor with {{StreamExpression}} 
(StreamExpressionParameter interface) parameter which the evaluators or 
operators doesn't implement (they implement Expressible interface).
{code}
  public AddEvaluator(StreamExpression expression, StreamFactory factory) 
throws IOException{
    super(expression, factory);
    
    if(containedEvaluators.size() < 1){
      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - 
expecting at least one value but found 
%d",expression,containedEvaluators.size()));
    }
  }
{code}

To accomodate the above request, strongly types java objects for all, we need 
to create rule-based constructors for all the evaluators and operators, so that 
those can be used in {{SelectStream}}.

> Add Constructor to SelectStream which takes StreamEvaluators as argument. 
> Current schema forces one to enter a stream expression string only 
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-11600
>                 URL: https://issues.apache.org/jira/browse/SOLR-11600
>             Project: Solr
>          Issue Type: Improvement
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: SolrJ, streaming expressions
>    Affects Versions: 6.6.1, 7.1
>            Reporter: Aroop
>            Priority: Trivial
>              Labels: easyfix
>         Attachments: SOLR-11600.patch
>
>
> The use case is to be able able to supply stream evaluators over a rollup 
> stream in the following manner, but with instead with Strongly typed objects 
> and not steaming-expression strings.
> {code:bash}
> curl --data-urlencode 'expr=select(
> id,
> div(sum(cat1_i),sum(cat2_i)) as metric1,
> coalesce(div(sum(cat1_i),if(eq(sum(cat2_i),0),null,sum(cat2_i))),0) as 
> metric2,
> rollup(
> search(col1, q=*:*, fl="id,cat1_i,cat2_i,cat_s", qt="/export", sort="cat_s 
> asc"),
> over="cat_s",sum(cat1_i),sum(cat2_i)
> ))' http://localhost:8983/solr/col1/stream
> {code}
> the current code base does not allow one to provide selectedEvaluators in a 
> constructor, so one cannot prepare their select stream via java code:
> {code:java}
> public class SelectStream extends TupleStream implements Expressible {
>     private static final long serialVersionUID = 1L;
>     private TupleStream stream;
>     private StreamContext streamContext;
>     private Map<String, String> selectedFields;
>     private Map<StreamEvaluator, String> selectedEvaluators;
>     private List<StreamOperation> operations;
>     public SelectStream(TupleStream stream, List<String> selectedFields) 
> throws IOException {
>         this.stream = stream;
>         this.selectedFields = new HashMap();
>         Iterator var3 = selectedFields.iterator();
>         while(var3.hasNext()) {
>             String selectedField = (String)var3.next();
>             this.selectedFields.put(selectedField, selectedField);
>         }
>         this.operations = new ArrayList();
>         this.selectedEvaluators = new HashMap();
>     }
>     public SelectStream(TupleStream stream, Map<String, String> 
> selectedFields) throws IOException {
>         this.stream = stream;
>         this.selectedFields = selectedFields;
>         this.operations = new ArrayList();
>         this.selectedEvaluators = new HashMap();
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to