Github user meiercaleb commented on a diff in the pull request:

    https://github.com/apache/incubator-rya/pull/156#discussion_r112546328
  
    --- Diff: 
extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
 ---
    @@ -62,85 +66,113 @@ public ObservedColumn getObservedColumn() {
     
         @Override
         public void process(final TransactionBase tx, final Bytes brow, final 
Column column) {
    -        //get string representation of triple
    -        String row = brow.toString();
    -        final String triple = IncUpdateDAO.getTripleString(brow);
    -        String visibility = tx.gets(row, FluoQueryColumns.TRIPLES, "");
    -       
    -        //get variable metadata for all SP in table
    -        RowScanner rscanner = 
tx.scanner().over(Span.prefix(SP_PREFIX)).fetch(FluoQueryColumns.STATEMENT_PATTERN_VARIABLE_ORDER).byRow().build();
    -       
    +        // Get string representation of triple.
    +        final RyaStatement ryaStatement = 
IncUpdateDAO.deserializeTriple(brow);
    +        log.trace(
    +                "Transaction ID: " + tx.getStartTimestamp() + "\n" +
    +                "Rya Statement: " + ryaStatement + "\n");
     
    -        //see if triple matches conditions of any of the SP
    +        final String triple = IncUpdateDAO.getTripleString(ryaStatement);
     
    -        for (ColumnScanner colScanner : rscanner) {
    +        // Iterate over each of the Statement Patterns that are being 
matched against.
    +        final RowScanner spScanner = tx.scanner()
    +                .over(Span.prefix(SP_PREFIX))
    +
    +                // Only fetch rows that have the pattern in them. There 
will only be a single row with a pattern per SP.
    +                .fetch(FluoQueryColumns.STATEMENT_PATTERN_PATTERN)
    +                .byRow()
    +                .build();
    +
    +        //see if triple matches conditions of any of the SP
    +        for (final ColumnScanner colScanner : spScanner) {
    +            // Get the Statement Pattern's node id.
                 final String spID = colScanner.getsRow();
     
    -            final StatementPatternMetadata spMetadata = 
QUERY_DAO.readStatementPatternMetadata(tx, spID);
    +            // Fetch its metadata.
    +            final StatementPatternMetadata spMetadata = 
QUERY_METADATA_DAO.readStatementPatternMetadata(tx, spID);
    +
    +            // Attempt to match the triple against the pattern.
                 final String pattern = spMetadata.getStatementPattern();
    -            
    -            for (ColumnValue cv : colScanner) {
    -                final String varOrders = cv.getsValue();
    -                final VariableOrder varOrder = new 
VariableOrder(varOrders);
    -                final String bindingSetString = getBindingSet(triple, 
pattern, varOrders);
    -
    -                //Statement matches to a binding set
    -                if(bindingSetString.length() != 0) {
    -                    final VisibilityBindingSet bindingSet = new 
VisibilityBindingSet(
    -                        CONVERTER.convert(bindingSetString, varOrder),
    -                        visibility);
    -                    final String valueString = 
CONVERTER.convert(bindingSet, varOrder);
    -                    tx.set(spID + NODEID_BS_DELIM + bindingSetString, 
FluoQueryColumns.STATEMENT_PATTERN_BINDING_SET, valueString);
    +            final VariableOrder varOrder = spMetadata.getVariableOrder();
    +            final String bindingSetString = getBindingSet(triple, pattern, 
varOrder);
    +
    +            // Statement matches to a binding set.
    +            if(bindingSetString.length() != 0) {
    +                // Fetch the triple's visibility label.
    +                final String visibility = tx.gets(brow.toString(), 
FluoQueryColumns.TRIPLES, "");
    +
    +                // Create the Row ID for the emitted binding set. It does 
not contain visibilities.
    +                final String row = spID + NODEID_BS_DELIM + 
bindingSetString;
    +                final Bytes rowBytes = Bytes.of( 
row.getBytes(Charsets.UTF_8) );
    +
    +                // If this is a new Binding Set, then emit it.
    +                if(tx.get(rowBytes, 
FluoQueryColumns.STATEMENT_PATTERN_BINDING_SET) == null) {
    --- End diff --
    
    This is a worthwhile optimization.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to