You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/03/01 01:15:41 UTC
svn commit: r1451441 - in /hive/branches/ptf-windowing/ql/src:
java/org/apache/hadoop/hive/ql/parse/ test/queries/clientnegative/
test/queries/clientpositive/ test/results/clientnegative/
test/results/clientpositive/
Author: hashutosh
Date: Fri Mar 1 00:15:41 2013
New Revision: 1451441
URL: http://svn.apache.org/r1451441
Log:
HIVE-4034
Summary: Made Window specification more flexible to allow syntaxes which are legal in SQL standard.
Test Plan: Added +ve and -ve testcases.
Reviewers: hbutani
Differential Revision: https://reviews.facebook.net/D8973
Added:
hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries.q
hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries2.q
hive/branches/ptf-windowing/ql/src/test/queries/clientpositive/ptf_window_boundaries.q
hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries.q.out
hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries2.q.out
hive/branches/ptf-windowing/ql/src/test/results/clientpositive/ptf_window_boundaries.q.out
Modified:
hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
Modified: hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g?rev=1451441&r1=1451440&r2=1451441&view=diff
==============================================================================
--- hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (original)
+++ hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g Fri Mar 1 00:15:41 2013
@@ -1979,6 +1979,7 @@ window_range_expression
@init { msgs.push("window_range_expression"); }
@after { msgs.pop(); }
:
+ KW_ROWS KW_UNBOUNDED KW_PRECEDING -> ^(TOK_WINDOWRANGE ^(KW_PRECEDING KW_UNBOUNDED) ^(KW_CURRENT)) |
KW_ROWS KW_BETWEEN s=rowsboundary KW_AND end=rowsboundary -> ^(TOK_WINDOWRANGE $s $end)
;
@@ -1995,6 +1996,7 @@ window_value_expression
@init { msgs.push("window_value_expression"); }
@after { msgs.pop(); }
:
+ KW_RANGE KW_UNBOUNDED KW_PRECEDING -> ^(TOK_WINDOWVALUES ^(KW_PRECEDING KW_UNBOUNDED) ^(KW_CURRENT)) |
KW_RANGE KW_BETWEEN s=valuesboundary KW_AND end=valuesboundary -> ^(TOK_WINDOWVALUES $s $end)
;
Modified: hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1451441&r1=1451440&r2=1451441&view=diff
==============================================================================
--- hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/branches/ptf-windowing/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Fri Mar 1 00:15:41 2013
@@ -10398,32 +10398,32 @@ public class SemanticAnalyzer extends Ba
}
private BoundarySpec processValueBoundary(ASTNode node) {
- BoundarySpec vbs = null;
+ BoundarySpec bs = null;
int type = node.getType();
switch(type)
{
case HiveParser.KW_PRECEDING:
- vbs = new ValueBoundarySpec(Direction.PRECEDING, null, BoundarySpec.UNBOUNDED_AMOUNT);
+ bs = new RangeBoundarySpec(Direction.PRECEDING, BoundarySpec.UNBOUNDED_AMOUNT);
break;
case HiveParser.KW_FOLLOWING:
- vbs = new ValueBoundarySpec(Direction.FOLLOWING, null, BoundarySpec.UNBOUNDED_AMOUNT);
+ bs = new RangeBoundarySpec(Direction.FOLLOWING, BoundarySpec.UNBOUNDED_AMOUNT);
break;
case HiveParser.KW_CURRENT:
- vbs = new CurrentRowSpec();
+ bs = new CurrentRowSpec();
break;
case HiveParser.KW_LESS:
- vbs = new ValueBoundarySpec(Direction.PRECEDING,
+ bs = new ValueBoundarySpec(Direction.PRECEDING,
(ASTNode) node.getChild(0),
Integer.parseInt(node.getChild(1).getText()));
break;
case HiveParser.KW_MORE:
- vbs = new ValueBoundarySpec(Direction.FOLLOWING,
+ bs = new ValueBoundarySpec(Direction.FOLLOWING,
(ASTNode) node.getChild(0),
Integer.parseInt(node.getChild(1).getText()));
break;
}
- return vbs;
+ return bs;
}
/*
Added: hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries.q
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries.q?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries.q (added)
+++ hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries.q Fri Mar 1 00:15:41 2013
@@ -0,0 +1,17 @@
+-- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+);
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows unbounded following)
+ from part distribute by p_mfgr sort by p_name;
+
Added: hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries2.q
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries2.q?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries2.q (added)
+++ hive/branches/ptf-windowing/ql/src/test/queries/clientnegative/ptf_window_boundaries2.q Fri Mar 1 00:15:41 2013
@@ -0,0 +1,17 @@
+-- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+);
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range unbounded following)
+ from part distribute by p_mfgr sort by p_name;
+
Added: hive/branches/ptf-windowing/ql/src/test/queries/clientpositive/ptf_window_boundaries.q
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/queries/clientpositive/ptf_window_boundaries.q?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/queries/clientpositive/ptf_window_boundaries.q (added)
+++ hive/branches/ptf-windowing/ql/src/test/queries/clientpositive/ptf_window_boundaries.q Fri Mar 1 00:15:41 2013
@@ -0,0 +1,31 @@
+-- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+);
+
+LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part;
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows unbounded preceding)
+ from part distribute by p_mfgr sort by p_name;
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range unbounded preceding)
+ from part distribute by p_mfgr sort by p_name;
+
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name;
+
+select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name;
Added: hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries.q.out
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries.q.out?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries.q.out (added)
+++ hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries.q.out Fri Mar 1 00:15:41 2013
@@ -0,0 +1,29 @@
+PREHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@part
+FAILED: ParseException line 4:50 mismatched input 'following' expecting KW_PRECEDING near 'unbounded' in window_range_expression
+
Added: hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries2.q.out
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries2.q.out?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries2.q.out (added)
+++ hive/branches/ptf-windowing/ql/src/test/results/clientnegative/ptf_window_boundaries2.q.out Fri Mar 1 00:15:41 2013
@@ -0,0 +1,29 @@
+PREHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@part
+FAILED: ParseException line 4:51 mismatched input 'following' expecting KW_PRECEDING near 'unbounded' in window_value_expression
+
Added: hive/branches/ptf-windowing/ql/src/test/results/clientpositive/ptf_window_boundaries.q.out
URL: http://svn.apache.org/viewvc/hive/branches/ptf-windowing/ql/src/test/results/clientpositive/ptf_window_boundaries.q.out?rev=1451441&view=auto
==============================================================================
--- hive/branches/ptf-windowing/ql/src/test/results/clientpositive/ptf_window_boundaries.q.out (added)
+++ hive/branches/ptf-windowing/ql/src/test/results/clientpositive/ptf_window_boundaries.q.out Fri Mar 1 00:15:41 2013
@@ -0,0 +1,185 @@
+PREHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: -- data setup
+CREATE TABLE part(
+ p_partkey INT,
+ p_name STRING,
+ p_mfgr STRING,
+ p_brand STRING,
+ p_type STRING,
+ p_size INT,
+ p_container STRING,
+ p_retailprice DOUBLE,
+ p_comment STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@part
+PREHOOK: query: LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part
+PREHOOK: type: LOAD
+PREHOOK: Output: default@part
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@part
+PREHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows unbounded preceding)
+ from part distribute by p_mfgr sort by p_name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@part
+#### A masked pattern was here ####
+POSTHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows unbounded preceding)
+ from part distribute by p_mfgr sort by p_name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@part
+#### A masked pattern was here ####
+Manufacturer#1 almond antique burnished rose metallic 2 1173.15
+Manufacturer#1 almond antique burnished rose metallic 2 2346.3
+Manufacturer#1 almond antique chartreuse lavender yellow 34 4100.06
+Manufacturer#1 almond antique salmon chartreuse burlywood 6 5702.650000000001
+Manufacturer#1 almond aquamarine burnished black steel 28 7117.070000000001
+Manufacturer#1 almond aquamarine pink moccasin thistle 42 8749.730000000001
+Manufacturer#2 almond antique violet chocolate turquoise 14 1690.68
+Manufacturer#2 almond antique violet turquoise frosted 40 3491.38
+Manufacturer#2 almond aquamarine midnight light salmon 2 5523.360000000001
+Manufacturer#2 almond aquamarine rose maroon antique 25 7222.02
+Manufacturer#2 almond aquamarine sandy cyan gainsboro 18 8923.62
+Manufacturer#3 almond antique chartreuse khaki white 17 1671.68
+Manufacturer#3 almond antique forest lavender goldenrod 14 2861.95
+Manufacturer#3 almond antique metallic orange dim 19 4272.34
+Manufacturer#3 almond antique misty red olive 1 6195.32
+Manufacturer#3 almond antique olive coral navajo 45 7532.61
+Manufacturer#4 almond antique gainsboro frosted violet 10 1620.67
+Manufacturer#4 almond antique violet mint lemon 39 2996.09
+Manufacturer#4 almond aquamarine floral ivory bisque 27 4202.35
+Manufacturer#4 almond aquamarine yellow dodger mint 7 6047.27
+Manufacturer#4 almond azure aquamarine papaya violet 12 7337.620000000001
+Manufacturer#5 almond antique blue firebrick mint 31 1789.69
+Manufacturer#5 almond antique medium spring khaki 6 3401.3500000000004
+Manufacturer#5 almond antique sky peru orange 2 5190.08
+Manufacturer#5 almond aquamarine dodger light gainsboro 46 6208.18
+Manufacturer#5 almond azure blanched chiffon midnight 23 7672.66
+PREHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range unbounded preceding)
+ from part distribute by p_mfgr sort by p_name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@part
+#### A masked pattern was here ####
+POSTHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range unbounded preceding)
+ from part distribute by p_mfgr sort by p_name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@part
+#### A masked pattern was here ####
+Manufacturer#1 almond antique burnished rose metallic 2 1173.15
+Manufacturer#1 almond antique burnished rose metallic 2 2346.3
+Manufacturer#1 almond antique chartreuse lavender yellow 34 4100.06
+Manufacturer#1 almond antique salmon chartreuse burlywood 6 5702.650000000001
+Manufacturer#1 almond aquamarine burnished black steel 28 7117.070000000001
+Manufacturer#1 almond aquamarine pink moccasin thistle 42 8749.730000000001
+Manufacturer#2 almond antique violet chocolate turquoise 14 1690.68
+Manufacturer#2 almond antique violet turquoise frosted 40 3491.38
+Manufacturer#2 almond aquamarine midnight light salmon 2 5523.360000000001
+Manufacturer#2 almond aquamarine rose maroon antique 25 7222.02
+Manufacturer#2 almond aquamarine sandy cyan gainsboro 18 8923.62
+Manufacturer#3 almond antique chartreuse khaki white 17 1671.68
+Manufacturer#3 almond antique forest lavender goldenrod 14 2861.95
+Manufacturer#3 almond antique metallic orange dim 19 4272.34
+Manufacturer#3 almond antique misty red olive 1 6195.32
+Manufacturer#3 almond antique olive coral navajo 45 7532.61
+Manufacturer#4 almond antique gainsboro frosted violet 10 1620.67
+Manufacturer#4 almond antique violet mint lemon 39 2996.09
+Manufacturer#4 almond aquamarine floral ivory bisque 27 4202.35
+Manufacturer#4 almond aquamarine yellow dodger mint 7 6047.27
+Manufacturer#4 almond azure aquamarine papaya violet 12 7337.620000000001
+Manufacturer#5 almond antique blue firebrick mint 31 1789.69
+Manufacturer#5 almond antique medium spring khaki 6 3401.3500000000004
+Manufacturer#5 almond antique sky peru orange 2 5190.08
+Manufacturer#5 almond aquamarine dodger light gainsboro 46 6208.18
+Manufacturer#5 almond azure blanched chiffon midnight 23 7672.66
+PREHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@part
+#### A masked pattern was here ####
+POSTHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (rows between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@part
+#### A masked pattern was here ####
+Manufacturer#1 almond antique burnished rose metallic 2 8749.730000000001
+Manufacturer#1 almond antique burnished rose metallic 2 7576.58
+Manufacturer#1 almond antique chartreuse lavender yellow 34 6403.43
+Manufacturer#1 almond antique salmon chartreuse burlywood 6 4649.67
+Manufacturer#1 almond aquamarine burnished black steel 28 3047.08
+Manufacturer#1 almond aquamarine pink moccasin thistle 42 1632.66
+Manufacturer#2 almond antique violet chocolate turquoise 14 8923.62
+Manufacturer#2 almond antique violet turquoise frosted 40 7232.9400000000005
+Manufacturer#2 almond aquamarine midnight light salmon 2 5432.24
+Manufacturer#2 almond aquamarine rose maroon antique 25 3400.26
+Manufacturer#2 almond aquamarine sandy cyan gainsboro 18 1701.6
+Manufacturer#3 almond antique chartreuse khaki white 17 7532.61
+Manufacturer#3 almond antique forest lavender goldenrod 14 5860.929999999999
+Manufacturer#3 almond antique metallic orange dim 19 4670.66
+Manufacturer#3 almond antique misty red olive 1 3260.27
+Manufacturer#3 almond antique olive coral navajo 45 1337.29
+Manufacturer#4 almond antique gainsboro frosted violet 10 7337.620000000001
+Manufacturer#4 almond antique violet mint lemon 39 5716.950000000001
+Manufacturer#4 almond aquamarine floral ivory bisque 27 4341.530000000001
+Manufacturer#4 almond aquamarine yellow dodger mint 7 3135.27
+Manufacturer#4 almond azure aquamarine papaya violet 12 1290.35
+Manufacturer#5 almond antique blue firebrick mint 31 7672.66
+Manufacturer#5 almond antique medium spring khaki 6 5882.970000000001
+Manufacturer#5 almond antique sky peru orange 2 4271.3099999999995
+Manufacturer#5 almond aquamarine dodger light gainsboro 46 2482.58
+Manufacturer#5 almond azure blanched chiffon midnight 23 1464.48
+PREHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@part
+#### A masked pattern was here ####
+POSTHOOK: query: select p_mfgr, p_name, p_size,
+ sum(p_retailprice) as s1 over (range between current row and unbounded following)
+ from part distribute by p_mfgr sort by p_name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@part
+#### A masked pattern was here ####
+Manufacturer#1 almond antique burnished rose metallic 2 8749.730000000001
+Manufacturer#1 almond antique burnished rose metallic 2 7576.58
+Manufacturer#1 almond antique chartreuse lavender yellow 34 6403.43
+Manufacturer#1 almond antique salmon chartreuse burlywood 6 4649.67
+Manufacturer#1 almond aquamarine burnished black steel 28 3047.08
+Manufacturer#1 almond aquamarine pink moccasin thistle 42 1632.66
+Manufacturer#2 almond antique violet chocolate turquoise 14 8923.62
+Manufacturer#2 almond antique violet turquoise frosted 40 7232.9400000000005
+Manufacturer#2 almond aquamarine midnight light salmon 2 5432.24
+Manufacturer#2 almond aquamarine rose maroon antique 25 3400.26
+Manufacturer#2 almond aquamarine sandy cyan gainsboro 18 1701.6
+Manufacturer#3 almond antique chartreuse khaki white 17 7532.61
+Manufacturer#3 almond antique forest lavender goldenrod 14 5860.929999999999
+Manufacturer#3 almond antique metallic orange dim 19 4670.66
+Manufacturer#3 almond antique misty red olive 1 3260.27
+Manufacturer#3 almond antique olive coral navajo 45 1337.29
+Manufacturer#4 almond antique gainsboro frosted violet 10 7337.620000000001
+Manufacturer#4 almond antique violet mint lemon 39 5716.950000000001
+Manufacturer#4 almond aquamarine floral ivory bisque 27 4341.530000000001
+Manufacturer#4 almond aquamarine yellow dodger mint 7 3135.27
+Manufacturer#4 almond azure aquamarine papaya violet 12 1290.35
+Manufacturer#5 almond antique blue firebrick mint 31 7672.66
+Manufacturer#5 almond antique medium spring khaki 6 5882.970000000001
+Manufacturer#5 almond antique sky peru orange 2 4271.3099999999995
+Manufacturer#5 almond aquamarine dodger light gainsboro 46 2482.58
+Manufacturer#5 almond azure blanched chiffon midnight 23 1464.48